339 lines
9.0 KiB
C++
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 |