Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/frame.h
T

523 lines
16 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#pragma once
#include <afxcView.h> // for CTreeView
#include "OpeningCheck.h"
#include "resource.h"
namespace NDoorWinCheck
{
class CDataTable;
class CSplitFrame : public CFrameWnd
{
DECLARE_DYNCREATE(CSplitFrame)
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
CSplitterWnd m_wndSplit;
};
class TreeItemData;
class CDoorWinTreeView;
class CGridView;
// 数据
class CFrameData
{
public:
CFrameData() : m_pGridView(NULL), m_pTreeView(NULL){m_pDataTable = new CDataTable;}
~CFrameData() {delete m_pDataTable;m_pDataTable = NULL;}
public:
CDataTable *m_pDataTable;
CGridView *m_pGridView;
CDoorWinTreeView *m_pTreeView;
};
enum ETips {eConflictTip = 0,
eNoFloorTip,
eNoDataTip,
eDataInOtherDWGTip,
eNoLabelTip,
eCorrespondingTip,
eBlockData,
eDocNotInProj,
eTipNum};
// 门窗检查窗口
class CDoorWinFrame : public CFrameWnd
{
DECLARE_DYNCREATE(CDoorWinFrame)
DECLARE_MESSAGE_MAP()
public:
CDoorWinFrame();
virtual ~CDoorWinFrame();
void SetGridView(CGridView *pGrid);
void SetTreeView(CDoorWinTreeView *pTree);
CDataTable* GetDataTable() {return m_dataCenter.m_pDataTable;}
CFrameData* GetData();
//////////////////////////////////////////////////////////////////////////
// 幻灯片显示函数:
//显示幻灯
static void ShowSlide(CStatic& st, CImageDC& imgdc, const TCHAR* sldName);
void SetSlideItem(TreeItemData *pItemData);
// 清空显示,和保存的数据
void ClearSlideItem();
void ShowSlide2d(CString &strStyle2d);
void ShowSlide3d(CString &strStyle3d);
// 更新原图
void UpdateDWG(TreeItemData *pItemData);
void ReDrawWnd(); // 窗口更新。
// 提示信息
void SetTip (ETips eTip, bool bSet = true);
CString GetTip(ETips eTip) const ;
CString GetTip() const ;
void SetConflictDataNum(int nNum) {m_nConflictDataNum = nNum;};
void SetNoLabelDataNum(int nNum) {m_nNoLabelDataNum = nNum;};
void ShowMessage();
void GetDataTip(CDataTable *pTable);
void ClearData();
void ReadDWG(); // 读取DWG中的数据。
BOOL AddTip(UINT idControl, const TCHAR *str=NULL);
public:
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd/*, UINT nID, CCreateContext* pContext = NULL*/);
protected:
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
virtual void PostNcDestroy(); // default to delete this.
virtual BOOL PreTranslateMessage(MSG* pMsg);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnClose();
afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
afx_msg void OnDestroy();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnBtnSetClick();
afx_msg void OnBtnUpdate();
afx_msg void OnBtnFromDWG();
afx_msg void OnBtnChoseExtent();
afx_msg void OnPic2dClick();
afx_msg void OnPic3dClick();
afx_msg void OnPaint();
afx_msg LONG_PTR onAcadKeepFocus(UINT_PTR, LONG_PTR);
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
protected:
// 距离尺寸计算函数
CRect BtnSetRect() const;
CRect Slide2dRect() const;
CRect Slide3dRect() const;
CRect SplitWndRect(const CRect &rectFrame) const;
CRect TipRect(const CRect &rectFrame) const;
CRect BtnUpdateRect(const CRect &rectFrame) const;
CRect BtnFromDWGRect(const CRect &rectFrame) const;
CRect BtnChoseRect(const CRect &rectFrame) const;
protected:
enum {IDC_BTN_UPDATE = 1,
IDC_BTN_FROMDWG,
IDC_BTN_EXTENT,
IDC_BTN_SET,
IDC_IMAGE_2D,
IDC_IMAGE_3D,
IDC_LABEL_MESSAGE};
CSize m_sizeSet; // 设置按钮的大小
CSize m_sizeBtnBottom; // 底部三个按钮的大小
CSize m_sizeSlide; // slide的宽高
int m_nLabelHei; //提示信息框高度
int m_nLeftBlank, m_nRightBlank, m_nTopBlank, m_nBottomBlank; // 上下左右的留空
// 行间距:上不按钮距离拆分窗口,拆分窗口距离提示信息,提示信息距离底部按钮
int m_nRowBlank1, m_nRowBlank2, m_nRowBlank3;
// 列间距(水平方向):设置按钮==slide2d, slide2d==slide3d, 底部按钮之间
int m_nColBlank1, m_nColBlank2, m_nColBlank3;
CButton m_btnSet;
CSplitFrame *m_pSplitFrame;
CEdit m_editTip;
CButton m_btnUpdate, m_btnFromDwg, m_btnChoseExtent;
CStatic m_pic3d; // 显示三维样式
CStatic m_pic2d; // 显示二维样式
CString m_cs2DStyle; // 2D
CString m_cs3DStyle; // 2D
CImageDC m_picSlide2d, m_picSlide3d;
TreeItemData *m_pItemToSlide;
// CButton m_btnImage;
CFont font;
CFrameData m_dataCenter;
int m_nConflictDataNum;
int m_nNoLabelDataNum;
bool m_bTip[eTipNum];
CToolTipCtrl m_wndToolTip;
};
// 树控件的每个选项需要关联一个数据,也用于Grid项,
// (工程项,本图项,未创建工程,冲突项)、(楼层项)、(某类型)、(某编号)(某子项,代表一个具体的门窗)
enum ETreeItemType {eProj = 0, eDWG, eNoProj, eConflict, eFloor, eSameStyle, eSameName, eOneItem, eOther};
class TreeItemData : public WRowData
{
protected:
TreeItemData() {} // 保护型构造函数,防止外部创建该实例
virtual ~TreeItemData() {} //
public:
virtual ETreeItemType GetType()const = 0;
virtual EEntType GetEntType() const {return eDoorTypeNum;}
// 此处的2D3D相对并非绝对的2D、3D。对于不同的子类型,该函数代表不同的意义。
// 注意更新sProp和DWG
virtual void SetSlideType2d(CString style) {}
virtual void SetSlideType3d(CString style) {}
void SetEntSlide(AcDbObjectId &id, SOpeningProp &sProp, CString strStyle, bool b2dOr3d);
void SetWidItemSlide(CWidItem *pWidItem, CString strStyle, bool b2dor3d);
void SetAryWidItemSlide(AryWidItemPtr &aryWidItem, CString strStyle, bool b2dOr3d);
};
class TreeNullItemData : public TreeItemData
{
virtual ETreeItemType GetType()const {return eOther;}
};
// 工程内
class TreeItemProj : public TreeItemData
{
public:
virtual ETreeItemType GetType()const {return eProj;}
CDataTable *pTable;
BOOL bNeedFloor; // 是否需要分楼层
};
// 本图内
class TreeItemDWG : public TreeItemData
{
public:
virtual ETreeItemType GetType()const {return eDWG;}
CDataTable *pTable; // 本图
BOOL bNeedFloor; // 是否需要分楼层
BOOL bOnlyProj; // 是否仅仅需要本工程的数据 // **
};
// 本图未创建工程
class TreeItemNoProj : public TreeItemData
{
public:
virtual ETreeItemType GetType()const {return eNoProj;}
CDataTable *pTable;
};
// 工程内冲突,工程外冲突,本图冲突
enum EConflictType {eConflictProj = 0, eConflictNoProj, eConflictDWG, eConflictProjDWG};
class TreeItemConflict : public TreeItemData
{
public:
virtual ETreeItemType GetType()const {return eConflict;}
CDataTable *pTable;
EConflictType nType; // 工程内冲突,未创建工程的冲突,本图冲突, 工程内本图冲突
};
class TreeItemFloor : public TreeItemData
{
public:
virtual ETreeItemType GetType()const {return eFloor;}
CGroup *pFloor; // 某层内的所有门窗
};
// 门、窗、弧窗、...
class TreeItemSameStyle : public TreeItemData
{
public:
virtual ~TreeItemSameStyle() {ClearAryWidItemPtr(aryWidItemPtr);}
virtual ETreeItemType GetType()const {return eSameStyle;}
virtual EEntType GetEntType() const;
virtual void SetSlideType2d(CString style);
virtual void SetSlideType3d(CString style);
AryWidItemPtr aryWidItemPtr; // 该类型所对应的所有的item
};
// 单个名字的节点分为下面的情况:主编号
class TreeItemSameName : public TreeItemData
{
public:
virtual ~TreeItemSameName() {}
virtual ETreeItemType GetType()const {return eSameName;}
virtual EEntType GetEntType() const;
virtual void SetSlideType2d(CString style);
virtual void SetSlideType3d(CString style);
CWidItem widItem; // 该类型所对应的所有的item
};
// 子编号
class GridItemOneItem : public TreeItemData
{
public:
virtual ETreeItemType GetType()const {return eOneItem;}
virtual EEntType GetEntType() const;
virtual void SetSlideType2d(CString style);
virtual void SetSlideType3d(CString style);
EEntType eEntType;
CItem *pItem;
int nIndex;
};
enum EGridColorIndex {
eMainLabelColor = 0, // 主编号
eTypeColor, // 门窗类型编号
eFloorColor, // 楼层编号
eChangedColor, // 被修改的数据
eRemovedColor, // 被删除的数据
eRemovedTextColor,
eOtherDWGColor, // 其他DWG图纸中的数据
eTempLabelColor, // 临时编号的数据
eOthersPropColor, // 不是自己的属性
eReadOnlyColor, // 只读的属性
eRedConflictColor, // 主编号,“冲突”红显
eColorItemNum // 总的编号的类型数
};
// 门窗属性显示表格
class CPropGrid : public WDGrid
{
DECLARE_DYNCREATE(CPropGrid)
public:
CPropGrid() : WDGrid(true, 100), m_nCurRow(-1) {}
void RemoveAllItem();
void ReCreate(TreeItemData *pItemData); // 绘制
void CreateProj(TreeItemProj *pItem);
void CreateDWG(TreeItemDWG *pItem);
void CreateNoProj(TreeItemNoProj *pItem);
void CreateConflict(TreeItemConflict *pItem);
void CreateFloor(TreeItemFloor *pItem);
void CreateOneStyle(TreeItemSameStyle *pItem);
void CreateOneName(TreeItemSameName *pItem);
WDGridTreeRow* AddNewRow(WDGridTreeRow *pParentRow);
// 向列表中添加元素:
bool AddSingleItem(CItem* pItem, int index, WDGridTreeRow *pParentRow,
AryEShowItem &aryShowItem, int nEntIndex, CStringArray &aryProp);
void AddSameNameItem(CWidItem* pWidItem, WDGridTreeRow *pParentRow,
AryEShowItem &aryShowItem);
void AddSameTypeItem(AryWidItemPtr &aryWidItemPtr, EEntType eEntType, WDGridTreeRow *pParent,
AryEShowItem &aryShowItem, BOOL bShowType = TRUE);
// 检测某类型是否具有某属性
static BOOL TestHasShowItem(EEntType eEntTyp, bool bText, EShowItem eShowItem);
void SetFlagProp(DWORD dw) {m_flagShowProp = dw;}
// 设置Grid列信息,通过它来设置列表的列。
void SetGridColumn(AryEtype &aryEtype, AryEShowItem &aryEShowItem);
void UpdateDWG();
void RefreshGridContent(); // 每个Grid重新提取内容,更新
void RefreshGridTreeRow(WDGridTreeRow *pRow); // 更新
// 第二列之后,第一列和第二列是标签列
EShowItem GetShowItemIndex(int nCol);
//add by lgy 20120301 为了保证修改grid单元格中类型,宽,高等项后
//要修改对应的新编号单元格的内容
CString GetItemSerial(const CString strType);
protected:
// 保护成员函数:
BOOL EmptyGrid() const {return GetColNum() < 2;}
// 检测是否有修改过的数据,eCorrespondingTip;
bool HasModifiedData();
bool HasModifiedData(WDGridTreeRow *pRow);
protected:
// 虚函数
// 用来设置颜色
virtual void OnBeforeRefresh(WDGridCell&cell);
// 准备combo中的数据
virtual void OnCellComboString(WDGridCell &cell,CComboBox&combo);
// 详细的设置一些编辑属性
virtual bool OnBeforeEdit(WDGridCell&cell,bool &bModified);
virtual bool OnModified(WDGridCell&cell,CString &text);
virtual void OnDataChanged();
DECLARE_MESSAGE_MAP()
virtual void OnCurChanged();//当前行列变化,子类一定要调整用基类
int m_nCurRow;
DWORD m_flagShowProp;
};
class CGridView : public CFormView
{
DECLARE_DYNCREATE(CGridView)
protected:
CGridView();
// Form Data
public:
//{{AFX_DATA(CInputView)
enum { IDD = IDD_DLG_GRIDFORM };
//}}AFX_DATA
void ReCreate(TreeItemData *pItemData); // 绘制
void UpdateDWG();
void RefreshGridContent(); // 每个Grid重新提取内容,更新
void RefreshGrid(); // Grid更新显示的颜色,内容不变
void Clear() {m_grid.RemoveAllItem();}
void SelectRow(long i) {if (i < m_grid.GetRowNum()) m_grid.SelectRow(i);}
// Implementation
//modify by lgy 20120306 9.0中要求提取图纸之后记录之前修改的页面
CPropGrid m_grid;
protected:
virtual ~CGridView();
virtual void OnInitialUpdate();
// Generated message map functions
//{{AFX_MSG(CInputView)
afx_msg void OnSize(UINT nType, int cx, int cy);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
//CPropGrid m_grid;
};
class CDoorWinTreeView : public ::CTreeView
{
DECLARE_DYNCREATE(CDoorWinTreeView)
public:
CDoorWinTreeView();
~CDoorWinTreeView();
// void SetDoorData();
void FillTreeView();
// 取得头分支的名字和扩展数据
// 0:第一分支名字;1:第二分支名字,2:第三分支名字;3:第四分支名字,如果不存在,返回空。
static CString GetHeadItemName(int nFlag);
static CString GetHeadItemName1(int nFlag);
static TreeItemData* GetHeadItemData(int nFlag);
static TreeItemData* GetHeadItemData1(int nFlag);
void ShowRootView() const;
void Clear();
static void SortWidItemAry(AryWidItemPtr &aryWidItemPtr);
static void SortAryItem(AryItemPtr &aryItemPtr);
protected:
void SetNewStyle(long lStyleMask, BOOL bSetBits);
static HTREEITEM AddTreeItem(CItem *pItem, CTreeCtrl &tree, TV_INSERTSTRUCT &tvItem, HTREEITEM hParent);
static HTREEITEM AddTreeItem(CTreeCtrl &tree, TV_INSERTSTRUCT &tvItem, CString &text, TreeItemData *pData, HTREEITEM hParent);
static void AddWidItemAry(CTreeCtrl &tree, AryWidItemPtr widItem[eDoorTypeNum], HTREEITEM hItemParent);
protected:
virtual void OnDraw(CDC* pDC);
virtual void OnInitialUpdate();
virtual void OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult);
// msg
afx_msg int OnCreate(LPCREATESTRUCT lpcs);
protected:
DECLARE_MESSAGE_MAP()
};
// 门窗设置对话框
class CSetDlg : public GlwCAcUiDialog
{
public:
CSetDlg(CWnd* pParent = NULL);
~CSetDlg() {}
enum { IDD = IDD_DLG_DOORWIN_CHECK_SET};
int CurrSel() const;
public:
static BOOL CheckCurrDWG() {return m_bCheckCurrDWG;}
static BOOL CheckCurrProj() {return m_bCheckCurrProj && !IsEmptyProject();}
static BOOL CheckBlock() {return m_bCheckBlock;}
static BOOL CheckText() {return m_bCheckText;}
static BOOL AccordFloor() {return m_bAccordFloor;}
static BOOL IsZoomDoorWin() {return m_bZoomDoorWin;}
static BOOL IsShowImag() {return m_bShowImg;}
// 供外部调用
// 检测某类型门窗的某种属性是否被选择了。
static BOOL TestItemChecked(EEntType eDoorWinCheckType, EShowItem eItem);
// 检测某类型门窗的是否包含某种属性。
static BOOL TestHasShowParam(EEntType eDoorWinCheckType, EShowItem eItem);
// 测试该标记中是否选中该选项
static BOOL TestItemIsSet(EShowItem eItem, DWORD flagCheck);
// 查看这几个类型都有哪几个参数
static DWORD GetShowFlag(AryEtype &aryType, AryEShowItem &aryShowItem);
// 查看这几个类型都有哪几个参数需要显示
static DWORD GetCheckFlag(AryEtype &aryType, AryEShowItem &aryShowItem);
static void SetParamFlag(DWORD &dwFlag, int eItem, BOOL bCheck);
static BOOL CheckParamFlag(DWORD &dwFlag, int eItem);
static void LoadCurDoorMsg(); //加载当前门窗检查中设置的信息,信息从dbf中读出来
void SaveCurDoorMsg(); //保存所需要的参数到DBF中
protected:
afx_msg void OnDestroy();
afx_msg void OnSelCmbTypeChange();
afx_msg void OnBtnHelpMsg();
afx_msg void OnClickDWG();
afx_msg void OnClickProj();
DECLARE_MESSAGE_MAP()
protected:
virtual void DoDataExchange(CDataExchange* pDX);
virtual BOOL OnInitDialog();
virtual void OnOK();
virtual void OnCancel();
private:
BOOL m_bOldCheckDWG;
BOOL m_bOldCheckProj;
static BOOL m_bCheckCurrDWG; // 检查本图门窗
static BOOL m_bCheckCurrProj; // 检查本工程门窗
static BOOL m_bCheckBlock; // 检查块参照和外部参照
static BOOL m_bCheckText; // 检查门窗文字
static BOOL m_bAccordFloor; // 分楼层显示
static BOOL m_bZoomDoorWin; // 门窗放大显示
static BOOL m_bShowImg; // 显示二维、三维样式
static CString m_strCurrChose;
static int m_nCurrSel; // 记录之前的选择
CComboBox m_cmbType; // 门窗类型分类
CListCtrl m_lstParm;// 显示参数
CButton m_btnCheckFloor; // 是否勾选分层显示;
CButton m_btnCheckText; // 检查文字按钮
CButton m_btnCheckBlock; // 检查快按钮
CButton m_btnCheckDWG; // 检查本图
CButton m_btnCheckProj; // 检查本工程
CButton m_btnShowImg; // 显示二维、三维样式。
// 检测某类型门窗的某种属性是否被选择了。
BOOL IsChecked(EEntType eDoorWinCheckType, EShowItem eItem) const;
// 设置某类型门窗的某种属性被选择与否。
void SetCheck(EEntType eDoorWinCheckType, int eItem/*EDoorWinShowType组合*/, BOOL bCheck);
// 检测某类型门窗的是否包含某种属性。
BOOL HasShowParam(EEntType eDoorWinCheckType, EShowItem eItem) const;
// 设置某类型门窗包含某种属性。
void SetShowParam(EEntType eDoorWinCheckType, int eItem/*EDoorWinShowType组合*/, BOOL bHas);
void GetCheckParam(int nSel);
void InitCheckParam(int nSel);
// 显示参数,是否选中
static DWORD m_flagShowParam1[eDoorTypeNum][2]; // 每种类型那些参数是要求选中的
DWORD m_flagShowParam[eDoorTypeNum][2]; // 当前的,用来控制是否保存
};
};