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

373 lines
11 KiB
C++

// BaseStairDlg.cpp : implementation file
//
#include "stdafx.h"
#include "BaseStairDlg.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CBaseStairDlg dialog
BOOL CBaseStairDlg::m_bNeed2D = TRUE;
BOOL CBaseStairDlg::m_bNeed3D = TRUE;
BOOL CBaseStairDlg::m_bNeedRight = FALSE;
BOOL CBaseStairDlg::m_bNeedLeft = FALSE;
int CBaseStairDlg::m_nPao = 2;
CString CBaseStairDlg::m_strElev = _T("0");
CString CBaseStairDlg::m_strStepHeight = _T("150.00");//modified by whl on 03/08/15
CString CBaseStairDlg::m_strStairHeight = _T("3000");
int CBaseStairDlg::m_nStepNum=20;
BOOL CBaseStairDlg::m_bAsAscent=FALSE;
BOOL CBaseStairDlg::m_bHasSlant=TRUE;
BOOL CBaseStairDlg::m_bOnGround = TRUE;
IMPLEMENT_DYNAMIC(CBaseStairDlg, CObjPreviewDlg)
CBaseStairDlg::CBaseStairDlg(UINT IDD, CWnd* pParent /*=NULL*/)
: CObjPreviewDlg(IDD, pParent)
{
m_lSectionPos=0.4;
m_rSectionPos=0.6;
m_bCreate=FALSE;
}
CBaseStairDlg::~CBaseStairDlg()
{
}
BEGIN_MESSAGE_MAP(CBaseStairDlg, CObjPreviewDlg)
//{{AFX_MSG_MAP(CBaseStairDlg)
ON_WM_TIMER()
ON_WM_PAINT ()
ON_BN_CLICKED(IDC_NO_PAO, UpdateImage)
ON_BN_CLICKED(IDC_BOTTOM_PAO, UpdateImage)
ON_BN_CLICKED(IDC_DOUBLE_PAO, UpdateImage)
ON_BN_CLICKED(IDC_UP_SECT, UpdateImage)
ON_BN_CLICKED(IDC_LEFT_BEAM,UpdateImage)
ON_BN_CLICKED(IDC_RIGHT_BEAM,UpdateImage)
ON_BN_CLICKED(IDC_NEED2D, UpdateSel)
ON_BN_CLICKED(IDC_NEED3D, UpdateSel)
ON_BN_CLICKED(IDC_HAS_SLANT, UpdateSel)
ON_BN_CLICKED(IDC_AS_ASCENT, UpdateSel)
ON_EN_CHANGE(IDC_STEP_HEIGHT,OnChangeStepHeight)
ON_EN_CHANGE(IDC_STEP_NUM, OnChangeStepNum)
ON_EN_CHANGE(IDC_STAIR_HEIGHT,OnChangeStairHeight)
ON_EN_KILLFOCUS(IDC_STEP_NUM,OnKFStepNum)
ON_EN_KILLFOCUS(IDC_STEP_HEIGHT,OnKFStepHeight)
ON_EN_KILLFOCUS(IDC_STAIR_HEIGHT,OnKFStairHeight)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CBaseStairDlg::OnChangeStairHeight()
{
//UpdateEdit(IDC_STAIR_HEIGHT);//removed by whl on 03/08/15
}
void CBaseStairDlg::OnChangeStepNum()
{
UpdateEdit(IDC_STEP_NUM);
}
void CBaseStairDlg::OnChangeStepHeight()
{
UpdateEdit(IDC_STEP_HEIGHT);
}
void CBaseStairDlg::OnKFStairHeight()
{
if (GetDlgItem(IDCANCEL)!=GetFocus())
UpdateEdit(IDC_STAIR_HEIGHT,true);
}
void CBaseStairDlg::OnKFStepHeight()
{
if (GetDlgItem(IDCANCEL)!=GetFocus())
UpdateEdit(IDC_STEP_HEIGHT,true);
}
void CBaseStairDlg::OnKFStepNum()
{
if (GetDlgItem(IDCANCEL)!=GetFocus())
UpdateEdit(IDC_STEP_NUM,true);
}
void CBaseStairDlg::DoDataExchange(CDataExchange* pDX)
{
CObjPreviewDlg::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBaseStairDlg)
DDX_Text(pDX, IDC_STEP_ELEV, m_strElev);
DDX_Check(pDX, IDC_NEED2D, m_bNeed2D);
DDX_Check(pDX, IDC_NEED3D, m_bNeed3D);
DDX_Check(pDX, IDC_LEFT_BEAM, m_bNeedLeft);
DDX_Check(pDX, IDC_RIGHT_BEAM, m_bNeedRight);
DDX_Radio(pDX, IDC_NO_PAO, m_nPao);
DDX_Check(pDX, IDC_AS_ASCENT, m_bAsAscent);
DDX_Check(pDX, IDC_HAS_SLANT, m_bHasSlant);
DDX_Check(pDX, IDC_ON_GROUND, m_bOnGround);
DDX_Control(pDX, IDC_STEP_NUM_SPIN, stepNumSpin);
//}}AFX_DATA_MAP
if (!pDX->m_bSaveAndValidate)
{
DDX_Text(pDX, IDC_STAIR_HEIGHT, m_strStairHeight);
DDX_Text(pDX, IDC_STEP_HEIGHT, m_strStepHeight);
DDX_Text(pDX, IDC_STEP_NUM, m_nStepNum);
}
}
//数据变化关系:
//梯段高度变化会引起踏步数变化,同时微调踏步高度;
//踏步高度变化会引起踏步数变化,同时微调踏步高度,梯段高度不变
//踏步数变化会引起踏步高度变化,不影响梯段高度
bool CBaseStairDlg::UpdateEdit(UINT ctrlID,bool bReportError)
{
CEdit *pEdit=(CEdit*)GetDlgItem(ctrlID);
if (pEdit==NULL)
return false;
static bool bUpdating=false;
if (bUpdating)
return false;
bUpdating=true;
bool result=true;
CDataExchange dxOut(this,false);
CString temp;
pEdit->GetWindowText(temp);
switch(ctrlID) {
case IDC_STAIR_HEIGHT: {//modified on 03/08/15 by whl
if (_tstof(temp)>=2*_tstof(m_strStepHeight)-_DIST_SNAP) {//最少当前两踏步高
m_strStairHeight=temp;
m_nStepNum=(int)(_tstof(m_strStairHeight)/_tstof(m_strStepHeight)+0.5);
m_strStepHeight.Format(_T("%.2f"),(_tstof(m_strStairHeight)/m_nStepNum));
DDX_Text(&dxOut,IDC_STEP_HEIGHT,m_strStepHeight);
DDX_Text(&dxOut,IDC_STEP_NUM,m_nStepNum);
UpdateImage();
} else if (bReportError) {
AfxMessageBox(_T("梯段高度太小!"));
DDX_Text(&dxOut,IDC_STAIR_HEIGHT,m_strStairHeight);//还原
pEdit->SetFocus();
pEdit->SetSel(0,-1);
}
}
break;
case IDC_STEP_NUM: {
if (_ttoi(temp)>1) {
m_nStepNum=_ttoi(temp);
m_strStepHeight.Format(_T("%.2f"),_tstof(m_strStairHeight)/m_nStepNum);//modified on 03/07/15 by whl
DDX_Text(&dxOut,IDC_STEP_HEIGHT,m_strStepHeight);
UpdateImage();
} else if (bReportError) {
AfxMessageBox(_T("踏步数必需大于1!"));
DDX_Text(&dxOut,IDC_STEP_NUM,m_nStepNum);//还原
pEdit->SetFocus();
pEdit->SetSel(0,-1);
}
}
break;
case IDC_STEP_HEIGHT: {
int num=(int)(_tstof(m_strStairHeight)/_tstof(temp)+0.5);
if (_tstof(temp)>0&&num>1) {
m_nStepNum=num;
m_strStepHeight.Format(_T("%.2f"),_tstof(m_strStairHeight)/m_nStepNum);//modified on 03/07/15 by whl
DDX_Text(&dxOut,IDC_STEP_NUM,m_nStepNum);
if (bReportError)
DDX_Text(&dxOut,IDC_STEP_HEIGHT,m_strStepHeight);//自动调整
UpdateImage();
} else if (bReportError) {
if (_tstof(temp)<=0)
AfxMessageBox(_T("踏步高度大小!"));
else
AfxMessageBox(_T("新踏步高度将造成踏步数小于2,请重新输入或先增大梯段高度!"));
DDX_Text(&dxOut,IDC_STEP_HEIGHT,m_strStepHeight);//还原
pEdit->SetFocus();
pEdit->SetSel(0,-1);
}
}
break;
default:
result=false;
}
bUpdating=false;
return result;
}
//响应用户选定动作
void CBaseStairDlg::UpdateSel()
{
BOOL bOld2D=m_bNeed2D,bOld3D=m_bNeed3D;
UpdateData();
GetDlgItem(IDC_HAS_SLANT)->EnableWindow(m_bAsAscent);
GetDlgItem(IDC_ON_GROUND)->EnableWindow(m_bAsAscent);
//GetDlgItem(IDC_STEP_HEIGHT)->EnableWindow(!m_bAsAscent);
//GetDlgItem(IDC_STEP_NUM)->EnableWindow(!m_bAsAscent);
//stepNumSpin.EnableWindow(!m_bAsAscent);
if (!m_bNeed3D&&!m_bNeed2D)
{
AfxMessageBox(_T("三维和二维至少选其一!"));
m_bNeed3D=bOld3D;
m_bNeed2D=bOld2D;
((CButton*)GetDlgItem(IDC_NEED2D))->SetCheck(m_bNeed2D);
((CButton*)GetDlgItem(IDC_NEED3D))->SetCheck(m_bNeed3D);
}
//GetDlgItem(IDC_LEFT_BEAM)->EnableWindow(m_bNeed3D);
//GetDlgItem(IDC_RIGHT_BEAM)->EnableWindow(m_bNeed3D);
GetDlgItem(IDC_NO_PAO)->EnableWindow(m_bNeed2D);
GetDlgItem(IDC_BOTTOM_PAO)->EnableWindow(m_bNeed2D);
GetDlgItem(IDC_DOUBLE_PAO)->EnableWindow(m_bNeed2D);
//nsh 修改于20070910
GetDlgItem(IDC_UP_SECT)->EnableWindow(m_bNeed2D);
UpdateImage();
//GetDlgItem(IDC_STEP_HEIGHT)->ShowWindow(!m_bAsAscent?SW_NORMAL:SW_HIDE);
//GetDlgItem(IDC_STEP_NUM)->ShowWindow(!m_bAsAscent?SW_NORMAL:SW_HIDE);
//GetDlgItem(IDC_STEP_HEIGHT_STATIC)->ShowWindow(!m_bAsAscent?SW_NORMAL:SW_HIDE);
//GetDlgItem(IDC_STEP_NUM_STATIC)->ShowWindow(!m_bAsAscent?SW_NORMAL:SW_HIDE);
//stepNumSpin.ShowWindow(!m_bAsAscent?SW_NORMAL:SW_HIDE);
}
BOOL CBaseStairDlg::OnInitDialog()
{
CObjPreviewDlg::OnInitDialog();
stepNumSpin.SetRange(2,10000);
AddTip(IDC_NEED3D);
AddTip(IDC_NEED2D);
AddTip(IDC_STAIR_HEIGHT_STATIC,_T("楼梯高度始终等于所有踏步的高度总和,改变楼梯高度将使踏步数变化,同时可能微调踏步高度"));//modified by whl on 03/08/15
AddTip(IDC_STEP_NUM_STATIC,_T("改变踏步数将使踏步高度反向变化"));
AddTip(IDC_STEP_HEIGHT_STATIC,_T("输入一个大概的近似踏步高度,系统将自动设置正确值;改变踏步高度将引起踏步数反向变化"));
UpdateSel();
UpdateImage();
if (m_bCreate) {
CWnd *pWnd=GetDlgItem(IDC_STEP_ELEV);
if (pWnd) {
pWnd->SetWindowText(_T(""));
pWnd->EnableWindow(FALSE);
}
}
return TRUE;
}
void CBaseStairDlg::Dlg2Obj(AcDbEntity *pObj)//导出
{
TDbStair *pStep=TDbStair::cast(pObj);
ASSERT(pObj);
if (!m_bNeed2D)
pStep->Set2DFlag(0);
else
{
pStep->Set2DFlag(m_nPao + 1);
pStep->SetSectionPos(0, m_lSectionPos);
pStep->SetSectionPos(1, m_rSectionPos);
}
if (!m_bNeed3D)
pStep->Set3DFlag(0);
else
pStep->Set3DFlag(SF_HAS3D);
pStep->SetSideBeam(OFFSET_LEFT, m_bNeedLeft);
pStep->SetSideBeam(OFFSET_RIGHT, m_bNeedRight);
pStep->SetElevation(_tstof(m_strElev));
pStep->SetOnGround(m_bOnGround);
pStep->SetAscent(m_bAsAscent);
pStep->SetSlant(m_bHasSlant);
pStep->SetStepHeight(_tstof(m_strStepHeight));
pStep->SetStepNum(m_nStepNum);
return;
}
void CBaseStairDlg::Obj2Dlg(const AcDbEntity *pObj)//导入
{
TDbStair *pStep=TDbStair::cast(pObj);
ASSERT(pObj);
int nStairFlag2D = pStep->Get2DFlag();
int nStairFlag3D = pStep->Get3DFlag();
//modify by xlc on 090222
// m_bNeed3D = (nStairFlag3D!=0);
m_bNeed3D = pStep->Has3D();
m_bNeedLeft=pStep->GetSideBeam(OFFSET_LEFT)!=0;//modidfied
m_bNeedRight=pStep->GetSideBeam(OFFSET_RIGHT)!=0;//modified
m_bNeed2D = (nStairFlag2D!=0);
if (m_bNeed2D)
m_nPao = nStairFlag2D - 1;
m_strElev=Dist2Str(pStep->GetElevation());
m_strStairHeight=Dist2Str(pStep->GetStairHeight());
m_lSectionPos=pStep->GetSectionPos(0);
m_rSectionPos=pStep->GetSectionPos(1);
m_bAsAscent = pStep->IsAscent();
m_bOnGround = pStep->IsOnGround();
m_bHasSlant = pStep->HasSlant();
if (!m_bAsAscent)//坡道使用内部确定值,如导入会忘记楼梯的最近参数 。
{
m_nStepNum=pStep->GetStepNum();
m_strStepHeight.Format(_T("%.2f"),pStep->GetStepHeight());//modified on 03/07/15 by whl
}
}
// Zyu modify on 100721
//void CBaseStairDlg::OnTimer(UINT nIDEvent)
void CBaseStairDlg::OnTimer(UINT_PTR nIDEvent)
{
if(nIDEvent==1)//暂用于改善外观
{
KillTimer(1);
MSG msg;
while(::PeekMessage(&msg, m_hWnd, WM_TIMER, WM_TIMER, PM_REMOVE));
GetDlgItem(IDC_AS_ASCENT)->Invalidate();
GetDlgItem(IDC_NEED2D)->Invalidate();
GetDlgItem(IDC_NEED3D)->Invalidate();
}
CObjPreviewDlg::OnTimer(nIDEvent);
}
void CBaseStairDlg::OnPaint()
{
CObjPreviewDlg::OnPaint();
SetTimer(1,10,NULL);
}
BOOL CBaseStairDlg::PreTranslateMessage(MSG *pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
// Zyu modify on 100722,支持64位
//int vk=pMsg->wParam;
INT_PTR vk=pMsg->wParam;
if(vk==VK_RETURN&&GetFocus()==GetDlgItem(IDC_STEP_HEIGHT))
{
UpdateEdit(IDC_STEP_HEIGHT,TRUE);
//NextDlgCtrl();
return TRUE;
}
//modify by xlc on 090513 解决回车和ESC退出的问题
else if (pMsg->wParam == VK_RETURN)
{
CWnd *wnd = GetFocus ();
if (wnd != NULL)
{
TCHAR str[256];
CString ClassName = _T("Button");
GetClassName (wnd->m_hWnd, str, 256);
if (ClassName == str)
{
UINT i = wnd->GetDlgCtrlID ();
SendMessage (WM_COMMAND, i, (LPARAM)wnd->m_hWnd);
return TRUE;
}
}
CWnd *mwnd = GetDlgItem (IDOK);
if (mwnd)
{
mwnd->SetFocus();
return TRUE;
}
}
else if (pMsg->wParam == VK_ESCAPE)
{
GetDlgItem(IDCANCEL)->SetFocus();
CModelessDialog::OnCancel ();
return FALSE;
}
}
return CObjPreviewDlg::PreTranslateMessage(pMsg);
}