Files
envi-code/SourceCode/Code2026/tg_shs/inc/TArch/Project.h
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

339 lines
9.0 KiB
C++

#ifndef PROJECT_H
#define PROJECT_H
#define TYPE_PJ_ITEM 0
#define TYPE_PJ_GROUP 1
#define TYPE_PJ_FILE 2
#define TYPE_PJ_FLOOR 3
#define TYPE_PROJECT 4
#define TYPE_PJ_ITEM_EX 5
#define HIDE_DWGSET 0x00001 // 工程数据库中隐藏图纸集
#define HIDE_FLOOR 0x00002 // 工程数据库中隐藏楼层表
#define FLOOR_IN_FRAME 0x0001 // 楼层在文件中框选并需要指定基点,否则以INSBASE为基点并不限范围
// add by gjm 2015/12/01 加入一条自定义消息,分别为CTGExportDlg和TGProjectBar两个窗口响应
#define WM_USER_REFRESH_PROJECT_CMB (WM_USER + 100)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
class XDbfTable;
class TARCH_EXP XFloorData
{
public:
int m_nIndex; // 自然层号
XString m_sDwgFile; // 所在图纸名称(全路径)
double m_nHeight; // 层高
// TArch7
bool m_bFloorInFrame; // 是否框选了楼层范围
XPoint m_ptBase; // 对齐基点
XPoint m_ptMin, m_ptMax; // 楼层范围
public:
XFloorData(int idx, const TCHAR *dwg, double h): m_nIndex(idx), m_sDwgFile(dwg), m_nHeight(h),m_bFloorInFrame(false) {}
~XFloorData() {};
public:
bool IsSameData(const XFloorData& f)const;
static int CompareForSort(const XFloorData *, const XFloorData *);
static int CompareForFind(const XFloorData *, const void *);
};
// XFloorData operate
// 取得楼层数据库的DBF文件名称
TARCH_EXP int GetProjectDbf(XString &m_sDbfFile);
// 解析字符串,变成楼层数组
TARCH_EXP BOOL StrToIntList(const TCHAR * pszDesc, DList<int> &lstResult);
TARCH_EXP int CheckFloorData(DList<XFloorData> &lstFloors);
TARCH_EXP int GetFloorData(XDbfTable &grp, DList<XFloorData> &lstFloors);
TARCH_EXP bool HasFloorInFrame(const DList<XFloorData>&floors);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 工程项基类
class TARCH_EXP TProjectItem
{
protected:
CString m_sName; // 名称
public:
TProjectItem(const TCHAR*sName = NULL): m_sName(sName) {} // ok
virtual ~TProjectItem() {} // ok
public:
virtual bool IsGroup()const {
return false;
} // ok
public:
virtual int GetType()const {
return 0;
} // ok
virtual CArchive& operator>>(CArchive&ar) const;
virtual CArchive& operator<<(CArchive&ar);
public:
CString GetName() const {
return m_sName;
} // ok
void SetName(const TCHAR*s) {
m_sName = s;
} // ok
public:
bool operator==(const TProjectItem&item) const {
return _tcsicmp(m_sName,item.GetName())==0;
} // ok
bool operator!=(const TProjectItem&item) const {
return _tcsicmp(m_sName,item.GetName())!=0;
} // ok
bool operator>(const TProjectItem&item) const {
return _tcsicmp(m_sName,item.GetName())>0;
} // ok
bool operator<(const TProjectItem&item) const {
return _tcsicmp(m_sName,item.GetName())<0;
} // ok
};
// 扩展项
class TProjectItemEx: public TProjectItem
{
protected:
int m_iByteSize;
char *m_pBuf;
public:
TProjectItemEx(const TCHAR* sName = NULL): TProjectItem(sName), m_pBuf(NULL), m_iByteSize(0) {} // ok
virtual ~TProjectItemEx() {
if (m_pBuf != NULL)
delete[] m_pBuf;
}
public:
void SetData(char *pData,int size);
int GetLength()const {
return m_iByteSize;
} // ok
char operator [](int i) const {
return m_pBuf[i];
} // ok
char& operator [](int i) {
return m_pBuf[i];
} // ok
public:
virtual int GetType()const {
return TYPE_PJ_ITEM_EX;
} // ok
virtual CArchive& operator>>(CArchive&ar)const;
virtual CArchive& operator<<(CArchive&ar);
};
// 组
class TARCH_EXP TProjectGroupItem: public TProjectItem, public PDList<TProjectItem>
{
public:
TProjectGroupItem(const TCHAR* sName = NULL): TProjectItem(sName) {} // ok
public:
virtual bool IsGroup()const {
return true;
} // ok
virtual int GetType()const {
return 1;
} // ok
virtual CArchive& operator>>(CArchive&ar) const;
virtual CArchive& operator<<(CArchive&ar);
// flag==0:全部查找,flag==1:只找节点,flag==2:只找目录
TProjectItem* FindItem(CString sName,bool bFindSubGroup = true,int flag = 0); // 未找到时返加NULL
};
// 图纸项
class TARCH_EXP TProjectFile: public TProjectItem
{
public:
static int s_iVersion;
public:
TProjectFile(const TCHAR*sName = NULL):TProjectItem(sName) {} // ok
public:
virtual int GetType()const {
return 2;
} // ok
virtual CArchive& operator>>(CArchive&ar) const;
virtual CArchive& operator<<(CArchive&ar);
};
// 楼层项
class TARCH_EXP TProjectFloor: public TProjectItem
{
public:
static int s_iVersion;
protected:
CString m_sLayerNo; // 楼层号,负数代表地下室,,如:1,2~6,12
double m_fHeight; // 层高
int m_iFlag; // 标志
XPoint m_ptBase; // 对齐基点
XPoint m_ptMin, m_ptMax; // 楼层范围
public:
TProjectFloor(const TCHAR* sName = NULL): TProjectItem(sName), m_iFlag(0) {} // ok
public:
virtual int GetType()const {
return 3;
} // ok
virtual CArchive& operator>>(CArchive&ar) const;
virtual CArchive& operator<<(CArchive&ar);
public:
CString GetLayerNo() const { // 楼层号
return m_sLayerNo;
} // ok
void SetLayerNo(const TCHAR* sNo) {
m_sLayerNo = sNo;
} // ok
// 解析楼层号,组成链表
BOOL GetLayerIndexList(DList<int> &lstResult) {
return StrToIntList(m_sLayerNo, lstResult);
} // ok
double GetHeight()const { // 层高
return m_fHeight;
} // ok
void SetHeight(double h) {
m_fHeight = h;
} // ok
bool IsFloorInFrame()const { // 标志
return (m_iFlag&FLOOR_IN_FRAME)!=0;
} // ok
void SetFloorInFrame(bool bFIF = true) {
if (bFIF)
m_iFlag |= FLOOR_IN_FRAME;
else
m_iFlag &= ~FLOOR_IN_FRAME;
} // ok
XPoint GetBasePoint()const { // 对齐基点
return m_ptBase;
} // ok
void SetBasePoint(XPoint pt) {
m_ptBase = pt;
} // ok
void GetRange(XPoint &ptMin, XPoint &ptMax) { // 楼层范围
ptMin = m_ptMin;
ptMax = m_ptMax;
} // ok
void SetRange(XPoint ptMin, XPoint ptMax) {
m_ptMin = ptMin;
m_ptMax = ptMax;
} // ok
bool IsInclude(XPoint) const;
};
// 工程
// modify by gjm 2015/11/30
// 改造 TProject 类,使其成为 两个窗口的扭带。
// 两个窗口分别来自 tch_kerncmd 与 tch_toolcmd 工程,两个工程互不引用信赖
// 但两个窗口需要互相刷新。
// 关于两个窗口分别是 TProjectBar 类 和 CTGExportDlg 类产生的。
// 具体原因是因为 TProjectManager 命令和 实体导出相关命令都会对 g_project 全局变量
// 产生操作。故由两个命令产生的界面需要互相刷新
class TARCH_EXP TProject: public TProjectGroupItem
{
public:
static int s_iVersion;
protected:
CString m_sFileFullName; // 工程文件全名
CWnd *m_pTGExportWnd, *m_pTGProjectBarWnd;
public:
TProject(const TCHAR* sName = NULL): TProjectGroupItem(sName), m_pTGExportWnd(NULL), m_pTGProjectBarWnd(NULL) {} // ok
virtual ~TProject();
public:
void SetTGExprotWnd(CWnd *pWnd) { m_pTGExportWnd = pWnd; }
CWnd* GetTGExprotWnd() { return m_pTGExportWnd; }
void SetTGProjectBarWnd(CWnd *pWnd) { m_pTGProjectBarWnd = pWnd; }
CWnd* GetTGProjectBarWnd() { return m_pTGProjectBarWnd; }
void RefreshTGExportDlg() { if (m_pTGExportWnd) m_pTGExportWnd->SendMessage(WM_USER_REFRESH_PROJECT_CMB); }
void RefreshTGProjectBar() { if (m_pTGProjectBarWnd) m_pTGProjectBarWnd->SendMessage(WM_USER_REFRESH_PROJECT_CMB); }
CString GetFileFullName() const { // ok,全路径名
return m_sFileFullName;
}
bool GetFilePath(CString &sPath) const; // 目录路径
bool GetProjectName(CString &sName) const; // 显示名
bool Is(CString sFullName)const; // 是否是当前工程
CString GetDwgFullName(CString sRelativeName)const; // 由内部dwg名取文件全名
CString GetDwgRelativeName(CString sFullName)const; // 由dwg全路径名取内部名
public:
virtual int GetType()const {
return 4;
}
virtual CArchive& operator>>(CArchive&ar) const;
virtual CArchive& operator<<(CArchive&ar);
public:
// Save后再New和Load!
bool Save()const;
void New(CString sFileFullName, int flag = 0); // 新文件自动建立,传入全路径即可
bool Load(CString sFileFullName);
public:
TProjectGroupItem* GetGroup(const TCHAR* sName) {
return (TProjectGroupItem*)FindItem(sName,false);
}
int GetFloorData(DList<XFloorData> &lstFloors);
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 全局工程数据库,始终保存当前工程,工程切换和关闭时自动保存
extern TARCH_IMPEXP TProject g_project;
// 将工程数据库位置记录入dwg文件中
extern TARCH_EXP bool WritePrjToDwg(const TCHAR* sPrjFile,const TCHAR *sDwgFile);
// 打开工程文件,不存在则尝试新建
extern TARCH_EXP bool OpenProjectDwg(CString szDwgFullName);
// 楼层表相关
inline TProjectGroupItem* GetFloorTable()
{
return g_project.GetGroup(_T("楼层"));
}
extern TARCH_EXP bool GetFloorFiles(XStringList &sFiles);
extern TARCH_EXP int GetFloorData(DList<XFloorData> &lstFloors);
// 返回指定图纸中,指定点所在的楼层框
extern TARCH_EXP TProjectFloor* HitTestFloor(const TCHAR* sDwg,XPoint pt);
#endif