#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 &lstResult); TARCH_EXP int CheckFloorData(DList &lstFloors); TARCH_EXP int GetFloorData(XDbfTable &grp, DList &lstFloors); TARCH_EXP bool HasFloorInFrame(const DList&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 { 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 &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 &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 &lstFloors); // 返回指定图纸中,指定点所在的楼层框 extern TARCH_EXP TProjectFloor* HitTestFloor(const TCHAR* sDwg,XPoint pt); #endif