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

261 lines
7.1 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#pragma once
#include "resource.h"
#include <adui.h>
#include <acui.h>
#include "afxwin.h"
#include "GsPreviewCtrl.h"
#include "XMLDOMFile.h"
#include <functional>
#include <vector>
#include <set>
namespace DRAWFRAME
{
struct STPage
{
CString _pagename, _grpname;
int _width, _length;
STPage(LPCTSTR gname, LPCTSTR pname, int w, int l): _pagename(pname), _grpname(gname), _width(w), _length(l){}
STPage(): _pagename(_T("")), _grpname(_T("")), _width(0), _length(0){};
};
typedef std::vector < STPage > PAGES ;
struct STPageGrp
{
CString _grpname;
int _idx, _width;
PAGES _pages;
STPageGrp(int idx, LPCTSTR name, int width, const PAGES & pages) : _width(width), _grpname(name), _idx(idx), _pages(pages){}
STPageGrp() : _grpname(_T("")), _idx(-1), _pages(0), _width(0){}
struct _comparePageGrp : public std::binary_function < const STPageGrp&, const STPageGrp&, bool >
{
bool operator () (const STPageGrp & group1, const STPageGrp & group2) const { return group1._idx < group2._idx; }
};
};
typedef std::set < STPageGrp, STPageGrp::_comparePageGrp> PAGEGRPS;
void InitPageGrp();
void default_init_func();
}
// sg add 100907,保存专版定制软件中,各个子院或所的信息
class CSpecialtyOffice
{
public:
CSpecialtyOffice();
CSpecialtyOffice(const CSpecialtyOffice& srcSpecialtyOffice);
public:
// 通长标题栏与图幅对应关系信息
typedef struct longTitleInfo
{
// 0表示横式图框,对应竖栏;1表示立式图框,对应横栏
int nRow;
// 图幅
CString csBreadth;
// 通长标题栏图块编号
CString csLongTitle;
} SLongTitle;
// 对中标志相关信息
typedef struct midAlignBlockInfo
{
// 是否有对中标志,0为否,1为是
int m_nHasMidBlock;
// DWB名
CString csDwbName;
// 图框上部、下部的对中标志,对应的图块名
CString csUpDownBlock;
// 图框左部的对中标志,对应的图块名
CString csLeftBlock;
// 图框右部的对中标志,对应的图块名
CString csRightBlock;
} SMidBlock;
public:
// 下属设计院名或设计所名称
CString m_csName;
// 保存通长标题栏的图库名,所有图幅和样式下的通长标题栏,肯定都放到一个TK里
CString m_csTkName;
// 各个图幅以及横式、立式样式下的通长标题栏图块名数组
CArray<SLongTitle, SLongTitle&> m_aryLongTitle;
// 各个位置下的对中标志图块名
SMidBlock m_sMidBlock;
public:
// 根据图幅和样式获得通长标题栏图块名
CString FindLongTitleBlkName(int nRow, int nBreadth);
// 判断是否有横栏
BOOL HasRANGEFrame();
};
// CDrawingFrameDlg 对话框
class CDrawingFrameDlg : public CAcUiDialog
{
DECLARE_DYNAMIC(CDrawingFrameDlg)
public:
CDrawingFrameDlg(CWnd* pParent = NULL);
virtual ~CDrawingFrameDlg();
// 对话框数据
enum { IDD = IDD_DRAWINGFRAME };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog();
virtual void OnOK();
protected:
DECLARE_MESSAGE_MAP()
int m_iStandard;
int m_iRow;
int m_iLengthen;
int m_iCustomSize;
CString m_strLength;
CString m_strWidth;
CString m_strScale;
CComboBox m_colLenthen;
CComboBox m_colCustomSize;
BOOL m_bStandard;
BOOL m_bLong;
BOOL m_bTicket;
BOOL m_bPosition;
BOOL m_bAdjunct;
BOOL m_bDirect;
BOOL m_bSpace;
HICON m_hIcon;
// sg add 100907,与下属设计院名或设计所名称的下拉列表相对应
CComboBox m_cmbOffice;
bool m_bPreview; //add by whl
protected:
void ReadStoreValue();
void WriteStoreValue();
BOOL GetBlockName(XString &sBlockName);
void SetSizeEdit(int type, int curSel = 0);
void UpdateLengthen();
void UpdateStandard(BOOL bFlag = TRUE);
void UpdateSize(BOOL bSaveAndValidate = FALSE);
void UpdateTitle();
void UpdateSpace();
void UpdateDirect();
protected: // 下列函数,只用在专版软件中
// sg add 100907,通过tch.ini文件,判断当前软件是否是专版
bool IsSpecialtyVer();
// sg add 100907,解析TSpecialtyOffice.xml文件,初始化m_lstOfficeInfo列表
// 下面几个函数,主要是用于分散代码,对应解析对应部分的XML文件,都只在GetOfficeInfoFromXML函数中调用
bool GetOfficeInfoFromXML();
void GetLineWidthXML(const CXMLDOMNodePtr &pXMLChildNodePtr); // 图框线宽
void GetTicketXML(const CXMLDOMNodePtr &pXMLChildNodePtr); // 会签
void GetLongTitleXML(const CXMLDOMNodePtr &pXMLChildNodePtr, CSpecialtyOffice &info); // 通长标题栏
void GetMidBlockXML(const CXMLDOMNodePtr &pXMLChildNodePtr, CSpecialtyOffice &info); // 对中标志
// sg add 100908,根据下属院别的选择以及图幅,获得对应的“通长标题栏”图块名称
bool GetLongTitleBlkName();
// sg add 111102,根据选择的下属院别,获得对中标记图块名称
BOOL GetMidAlignBlock(XString &szUpDownBlock, XString &szLeftBlock, XString &szRightBlock);
public:
afx_msg void OnDataChangeAx();
afx_msg void OnDataChangeR();
afx_msg void OnCbnSelchangeComboLenthength();
afx_msg void OnCbnSelchangeComboCustomsize();
afx_msg void OnEnKillfocusEditLength();
afx_msg void OnEnKillfocusEditWidth();
afx_msg void OnEnChangeEditLength();
afx_msg void OnEnChangeEditWidth();
afx_msg void OnBnClickedCheckTitleStandard();
afx_msg void OnBnClickedCheckTitleLong();
afx_msg void OnBnClickedCheckTicket();
afx_msg void OnBnClickedCheckPosition();
afx_msg void OnBnClickedCheckAdjunct();
afx_msg void OnBnClickedButtonPickadjunct();
afx_msg void OnBnClickedButtonPickticket();
afx_msg void OnBnClickedButtonPicktitle();
afx_msg void OnBnClickedButtonPickdirect();
afx_msg void OnCbnKillfocusComboScale();
afx_msg void OnBnClickedCheckSpace();
afx_msg void OnBnClickedCheckDirect();
// sg add 100908,增加院别选择事件
afx_msg void OnCbnSelchangeComboOffice();
protected:
CGsPreviewCtrl m_PreviewCtrl;
AcDbDatabase m_PreviewDb;
AcDbObjectId m_idOldBlock;
XString m_strStandard;
XString m_strLong;
XString m_strTichet;
XString m_strAdjunct;
XString m_strDirect;
// sg add 100907,增加院别信息列表
TDPtrList<CSpecialtyOffice> m_lstOfficeInfo;
// sg add 100916,保存用户上次选择的院别
static int m_nLastOffice;
// sg add 111102,根据选择的院别,确定“立式”是否可以选择
BOOL m_bRANGE;
// sg add 111014,从XML中读取是否有会签栏,只有一个且不与用户交互,下属设计院必须统一
// m_bTicket默认值的备份,防止经过用户一系列操作后,会签栏不正确的有或者没有了
BOOL m_bDefaultTicket;
// wlw add 130314,从XML中读取是否有附件栏,只有一个且不与用户交互,下属设计院必须统一
// m_bAdjunct默认值的备份,防止经过用户一系列操作后,会签栏不正确的有或者没有了
BOOL m_bDefaultAdjunct;
// sg add 111021,在专版中增加图框的线宽可以定制的功能
// 该值只有1组,下属设计院必须统一
AcGeDoubleArray m_aryFrameWidth;
//wlw add 130314,从专版XML中读取图幅可选
BOOL m_bA0;
BOOL m_bA1;
BOOL m_bA2;
BOOL m_bA3;
BOOL m_bA4;
CString GetSizeDesc();//返回图幅描述字符串
void InsertFrame(AcDbBlockTableRecord *pBlockTabRecord, AcGePoint3d ptIns,
double &width, double &high);
void DrawFrame(AcDbBlockTableRecord *pBlockTabRecord, AcGePoint3d ptIns,
double &width, double &high, int flag = 1);
void DrawFrameBlock(AcGePoint3d ptIns,double &width, double &high);
void DrawInsertPoint(AcDbBlockTableRecord *pBlockTabRecord, AcGePoint3d ptIns);
void InsertBlock(AcDbBlockTableRecord *pBlockTabRecord, XString sBlockName,
AcGePoint3d ptIns, double angle, AcDbObjectId idLayer);
void GetBlockSize(XString sBlockName, double &width, double &high);
void UpdatePreview();
virtual BOOL DestroyWindow();
};