373 lines
11 KiB
C++
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);
|
|
}
|