Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/TwoDoorDlg.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

444 lines
12 KiB
C++

// DoorWinDlg.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "TwoDoorDlg.h"
// 门联窗
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern BOOL InvokeTkwMan(const TCHAR *pszLib, BOOL bSelOnly, XString &sBlockName);
/////////////////////////////////////////////////////////////////////////////
// CTwoDoorDlg dialog
CTwoDoorDlg::CTwoDoorDlg(CWnd* pParent /*=NULL*/)
: CInsertOpeningDlg(CTwoDoorDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTwoDoorDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_sWin3DStyle=SYS_TWODOOR;
m_sDoor3DStyle = SYS_TWODOOR;
m_nDWidth = 1200; //大门宽
m_nWidth=1800; //总宽
m_nHeight=2100; //总高 modified by fxj 090323
m_nSill=0;
}
//根据给定的门窗 设置二,三维样式
void CTwoDoorDlg::SetStyle(const TDbOpening& opening)
{
XString sDwb2D, sDwg2D, sDwb3D, sDwg3D;
if (opening.GetStyle2dName(sDwb2D, sDwg2D)==Acad::eOk) {
m_sDoor3DStyle = XString(_T("%s(%s)"), (TCHAR *)sDwb2D, (TCHAR *)sDwg2D);
}
if (opening.GetStyle3dName(sDwb3D, sDwg3D)==Acad::eOk) {
m_sWin3DStyle = XString(_T("%s(%s)"), (TCHAR *)sDwb3D, (TCHAR *)sDwg3D);
}
}
// 保存编号相关属性:如果变动并且当前是自动编号的时候,则需要更新编号:
#define KEEP_LABEL_PROP \
int __nWid = (int)m_nWidth; \
int __nHei = (int)m_nHeight; \
int __nDoorWid = (int)m_nDWidth; \
CString __strBDoorStyle = m_sDoor3DStyle; \
CString __strSDoorStyle = m_sWin3DStyle
#define CHECK_LABEL_PROP_CHANGE \
{ \
bool bSame = (__nWid == (int)m_nWidth) && \
(__nHei == (int)m_nHeight) && \
(__nDoorWid == (int)m_nDWidth) && \
(__strBDoorStyle.CompareNoCase(m_sDoor3DStyle) == 0) && \
(__strSDoorStyle.CompareNoCase(m_sWin3DStyle) == 0); \
if (!bSame) InvalidateOldLabel(); \
}
void CTwoDoorDlg::DoDataExchange(CDataExchange* pDX)
{
KEEP_LABEL_PROP;
CInsertOpeningDlg::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTwoDoorDlg)
DDX_Control(pDX, IDC_DOORWIDTH, m_doorwCtl);
DDX_Control(pDX, IDC_DOORSTYLE, m_picDoor);
DDX_Control(pDX, IDC_WINSTYLE, m_picWin);
//}}AFX_DATA_MAP
if (pDX->m_bSaveAndValidate) {
CString csText;
GetDlgItem(IDC_DOORWIDTH)->GetWindowText(csText);
if (_tstof(csText)<_DIST_SNAP)
pDX->Fail();
m_nDWidth = _tstof(csText);
if (m_nDWidth>m_nWidth)
pDX->Fail();
} else {
CString csText;
csText.Format(_T("%.f"),m_nDWidth);
GetDlgItem(IDC_DOORWIDTH)->SetWindowText(csText);
// 显示幻灯
XString sSlidePath(256);
sSlidePath << m_sWin3DStyle;
ShowSlide(m_picWin, m_dcWin, sSlidePath);
_tcscpy(sSlidePath, _T(""));
sSlidePath << m_sDoor3DStyle;
ShowSlide(m_picDoor, m_dcDoor, sSlidePath);
}
CHECK_LABEL_PROP_CHANGE;
}
BEGIN_MESSAGE_MAP(CTwoDoorDlg, CInsertOpeningDlg)
//{{AFX_MSG_MAP(CTwoDoorDlg)
ON_WM_PAINT()
ON_WM_SETCURSOR()
ON_BN_CLICKED(IDC_DOORSTYLE, OnPicDoor)
ON_BN_CLICKED(IDC_WINSTYLE, OnPicWin)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTwoDoorDlg message handlers
BOOL CTwoDoorDlg::OnInitDialog()
{
CInsertOpeningDlg::OnInitDialog();
// TODO: Add extra initialization here
if (!CInsertOpeningDlg::bRefreshDlg)//add by whl
if (GetInsertMode()==ID_UPLEVEL_INSERT)
g_nInsertMode=0;
//GetDlgItem(ID_UPLEVEL_INSERT)->EnableWindow(FALSE);
m_toolbar.EnableButton(ID_UPLEVEL_INSERT, TRUE);
// add by xly on 110113 已有洞口插入灰显
m_toolbar.EnableButton(ID_HASHOLE_INSERT, FALSE);
InitCombox();
m_bInitMe=TRUE;
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//初始化组合框
void CTwoDoorDlg::InitCombox()
{
// sg add 101221,根据8.5需求,增加1600的默认门宽
// double width[] = {1500,1800,2100,2400};
double width[] = {1500,1600,1800,2100,2400};
double height[] = {2000,2100,2400,2500,2700,3000};
double high[] = {1200,1500,1800,2100};
double dwidth[] = {900};
DList<double> lstWidth(width, ELEMENTS(width)),
lstHeight(height, ELEMENTS(height)),
lstSill(high, ELEMENTS(high)), lstDWidth(dwidth, ELEMENTS(dwidth));
InitCombox(m_lstWidthBox, lstWidth);
InitCombox(m_doorwCtl, lstDWidth);
InitCombox(m_lstHeightBox,lstHeight);
//InitCombox(m_winhCtl,lstSill);
// sg add 110530,取得门槛的高度模数系列
double sill[] = {0, 50, 60, 100, 150, 200, 300, 600};
DList<double> lstDoorSill(sill, ELEMENTS(sill));
InitCombox(m_lstSillBox, lstDoorSill);
}
//初始化组合框
void CTwoDoorDlg::InitCombox(CComboBox& combox, DList<double> &lstModelNum)
{
CString szItem;
combox.ResetContent();
for (int i = 0 ; i < lstModelNum.Length(); i++) {
szItem.Format(_T("%d"), AS_INT(*lstModelNum[i]));
combox.AddString(szItem);
}
}
//显示幻灯
void CTwoDoorDlg::ShowSlide(CStatic& st, CImageDC& imgdc, const TCHAR* sldName)
{
XString sFullSld(256);
if (sldName && sldName[0])
sFullSld << g_sDwbPath << sldName;
CRect cR;
CDC* pDC = st.GetDC();
st.GetClientRect(&cR);
imgdc.InitDC(pDC,cR,GetAcadBackColor());
imgdc.PaintSlide(sFullSld);
st.ReleaseDC(pDC);
}
// 清除幻灯
void CTwoDoorDlg::ShowSlide(CStatic& st)
{
CRect cR;
CDC* pDC = st.GetDC();
CBrush Brush;
st.GetClientRect(&cR);
Brush.CreateSolidBrush(RGB(0,0,0));
pDC->FillRect(cR,&Brush);
st.ReleaseDC(pDC);
}
// 点取三维样式
void CTwoDoorDlg::OnPicDoor()
{
KEEP_LABEL_PROP;
XPushAutoHide noAutoHide(this);
// const TCHAR *pszPrompt = _T("选择大门式");
XString sLibFile, sBlockName;
sLibFile << g_sDwbPath << _T("WDLib3D.TKW");
sBlockName=m_sDoor3DStyle;
if (InvokeTkwMan(sLibFile, TRUE, sBlockName)) {
ShowSlide(m_picDoor, m_dcDoor, sBlockName);
m_sDoor3DStyle=XPathParser(sBlockName).m_sFileName;
}
CHECK_LABEL_PROP_CHANGE;
}
void CTwoDoorDlg::OnPicWin()
{
// sg add 110803,仿照选择大门样式,增加修改小门样式后的自动编号
KEEP_LABEL_PROP;
XPushAutoHide noAutoHide(this);
// const TCHAR *pszPrompt = _T("选择小门样式");
XString sLibFile, sBlockName;
sLibFile << g_sDwbPath << _T("WDLib3D.TKW");
sBlockName=m_sWin3DStyle;
if (InvokeTkwMan(sLibFile, TRUE, sBlockName)) {
ShowSlide(m_picWin, m_dcWin, sBlockName);
m_sWin3DStyle=XPathParser(sBlockName).m_sFileName;
}
// sg add 110803,仿照选择大门样式,增加修改小门样式后的自动编号
CHECK_LABEL_PROP_CHANGE;
}
BOOL CTwoDoorDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (pWnd && (pWnd->m_hWnd==m_picDoor.m_hWnd || pWnd->m_hWnd==m_picWin.m_hWnd)) {
CAcModuleResourceOverride vTemp;
HCURSOR hIcon = AfxGetApp()->LoadCursor( IDC_CUR_PICK );
SetCursor( hIcon );
return TRUE;
}
return CInsertOpeningDlg::OnSetCursor(pWnd, nHitTest, message);
}
void CTwoDoorDlg::OnPaint()
{
CDC* pDC;
CRect cR,cR1;
CPaintDC dc(this); // device context for painting
pDC = m_picDoor.GetDC();
m_picDoor.GetClientRect(&cR);
m_dcDoor.InitDC(pDC, cR,GetAcadBackColor());
m_dcDoor.Redraw();
m_picDoor.ReleaseDC(pDC);
pDC = m_picWin.GetDC();
m_picWin.GetClientRect(&cR1);
m_dcWin.InitDC(pDC,cR1,GetAcadBackColor());
m_dcWin.Redraw();
m_picWin.ReleaseDC(pDC);
}
//////////////////////////////////////////////////
// override memeber
BOOL CTwoDoorDlg::InitParamList(DList<XOpeningParam> &lstParam) const
{
lstParam.Append(new XOpeningParam(IDC_LABEL, _T("编号")));
lstParam.Append(new XOpeningParam(IDC_WIDTH, _T("总宽")));
lstParam.Append(new XOpeningParam(IDC_DOORWIDTH, _T("大门宽")));
lstParam.Append(new XOpeningParam(IDC_HEIGHT, _T("门高")));
lstParam.Append(new XOpeningParam(IDC_DOORSTYLE, _T("三维门式")));
lstParam.Append(new XOpeningParam(IDC_WINSTYLE, _T("三维窗式")));
return TRUE;
}
//add by lgy 20120119 拾取参数时分别为对话框初始化
int CTwoDoorDlg::ObjToDlg(TDbOpening* pOpening)
{
CInsertOpeningDlg::ObjToDlg(pOpening);
m_nDWidth=pOpening->m_nDoorWidth;
//显示幻灯片
XString sDwb2D, sDwg2D, sDwb3D, sDwg3D;
if (pOpening->GetStyle2dName(sDwb2D, sDwg2D)==Acad::eOk)
{
m_sDoor3DStyle = XString(_T("%s(%s)"), (TCHAR *)sDwb2D, (TCHAR *)sDwg2D);
}
if (pOpening->GetStyle3dName(sDwb3D, sDwg3D)==Acad::eOk)
{
m_sWin3DStyle = XString(_T("%s(%s)"), (TCHAR *)sDwb3D, (TCHAR *)sDwg3D);
}
XString sSlidePath(256);
sSlidePath << m_sWin3DStyle;
ShowSlide(m_picWin, m_dcWin, sSlidePath);
_tcscpy(sSlidePath, _T(""));
sSlidePath << m_sDoor3DStyle;
ShowSlide(m_picDoor, m_dcDoor, sSlidePath);
UpdateData(FALSE);
return 1;
}
// 用于编辑以及改选编号时
BOOL CTwoDoorDlg::SetDlgParamFrom(const TDbOpening &opening)
{
if (!CInsertOpeningDlg::SetDlgParamFrom(opening))
return FALSE;
m_nDWidth=opening.m_nDoorWidth;
// 设置门或者窗的样式, 包括2D & 3D
SetStyle(opening);
return TRUE;
}
void
CTwoDoorDlg::UpdateOpening(TDbOpening &op, BOOL bLoadStyle)
{
CInsertOpeningDlg::UpdateOpening(op, bLoadStyle);
op.m_nDoorWidth=m_nDWidth;
op.SetLabel(GetAutoLabel(&op));
}
BOOL CTwoDoorDlg::GetStyles(AcDbObjectId &idDoor, AcDbObjectId &idWin)
{
extern TARCH_IMPEXP void CheckOp3dStyle(AcDbObjectId idStyle3d);
XString sBlockDoor(_T("%s%s"), g_sDwbPath, (const TCHAR *)m_sDoor3DStyle);
XString sBlockWin(_T("%s%s"), g_sDwbPath, (const TCHAR *)m_sWin3DStyle);
XString szBlockDoor;
XString szBlockWin;
BOOL bLoadWin=(LoadDwbBlock(sBlockDoor, szBlockDoor)==RTNORM);
BOOL bLoadDoor=(LoadDwbBlock(sBlockWin, szBlockWin)==RTNORM);
if (!bLoadWin || !bLoadDoor)
return FALSE;
idDoor=InitBlock(szBlockDoor);
idWin=InitBlock(szBlockWin);
if (!!idDoor)
CheckOp3dStyle(idDoor);
if (!!idWin)
CheckOp3dStyle(idWin);
return TRUE;
}
/////////////////////////////////////////////////////////////
// 用对话框上的参数更新实体数据
// op--门/窗/门联窗-门/门联窗-窗
BOOL CTwoDoorDlg::ModifyOpeningWithDlgParam(TDbOpening &op)
{
AcDbObjectId id2d, id3d;
GetStyles(id2d, id3d);
int nUsageFlag=GetUsage();
// sg add 110804,将下面两行代码从CInsertOpeningDlg::ModifyOpeningWithDlgParam函数之后,提前到这里,主要是解决自动编号问题
// 在CInsertOpeningDlg::ModifyOpeningWithDlgParam函数中,进行了自动编号,而编号规则需要考虑是否2D、3D图块样式等
if (nUsageFlag==USE_EDIT || GetParamCheck(IDC_WINSTYLE))
op.m_nIdStyle3d=id3d;
if (nUsageFlag==USE_EDIT || GetParamCheck(IDC_DOORSTYLE))
op.m_nIdStyle2d=id2d;
if (nUsageFlag==USE_EDIT || GetParamCheck(IDC_DOORWIDTH))
op.m_nDoorWidth=m_nDWidth;
if (!CInsertOpeningDlg::ModifyOpeningWithDlgParam(op))
return FALSE;
op.SetSill(0.0); //子母门的底标高一定为0
return TRUE;
}
BOOL CTwoDoorDlg::GetTitleKeyString(XString &sKeyTitle) const
{
sKeyTitle=_T("子母门参数");
return TRUE;
}
//关键注册位置, 子类需要重载本方法
BOOL CTwoDoorDlg::GetRegLocation(XString &sRegLoc) const
{
sRegLoc = _T("TwoDoor");
return TRUE;
}
// 从注册表读入参数
BOOL CTwoDoorDlg::ReadParamFromRegistry()
{
if (!CInsertOpeningDlg::ReadParamFromRegistry())
return FALSE;
XString sRegSubLoc, sRegLoc(1024);
BOOL bOk=GetRegLocation(sRegSubLoc);
if (!bOk)
return FALSE;
sRegLoc << ::GetRegLocation() << _T("\\Settings");
CRegProperty regProp(sRegLoc, sRegSubLoc);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
if (!regProp.GetValue(_T("Door3DStyle"), m_sDoor3DStyle) ||
!regProp.GetValue(_T("Win3DStyle"), m_sWin3DStyle) ||
!regProp.GetValue(_T("BigDoorWidth"), m_nDWidth)
)
return FALSE;
return TRUE;
}
// 把最近的参数写入注册表
BOOL CTwoDoorDlg::WriteParamToRegistry() const
{
if (!CInsertOpeningDlg::WriteParamToRegistry())
return FALSE;
XString sRegSubLoc, sRegLoc(1024);
BOOL bOk=GetRegLocation(sRegSubLoc);
if (!bOk)
return FALSE;
sRegLoc << ::GetRegLocation() << _T("\\Settings");
CRegProperty regProp(sRegLoc, sRegSubLoc);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
if (!regProp.SetValue(_T("Door3DStyle"), m_sDoor3DStyle) ||
!regProp.SetValue(_T("Win3DStyle"), m_sWin3DStyle) ||
!regProp.SetValue(_T("BigDoorWidth"), m_nDWidth) )
return FALSE;
return TRUE;
}