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

524 lines
16 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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]; // 当前的,用来控制是否保存
};
};