387 lines
10 KiB
C++
387 lines
10 KiB
C++
// ArcStairDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "resource.h"
|
|
#include "ArcStairDlg.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CArcStairDlg dialog
|
|
CString CArcStairDlg::m_strStartAngle = _T("0");
|
|
CString CArcStairDlg::m_strSweepAngle = _T("180");
|
|
CString CArcStairDlg::m_strInRadius = _T("800");
|
|
int CArcStairDlg::m_nFace = 1;
|
|
int CArcStairDlg::m_nLocate = 0;
|
|
CString CArcStairDlg::m_strOutRadius = _T("2000");
|
|
CString CArcStairDlg::m_strStairWidth = _T("1200");
|
|
|
|
// ----------------------------- [9/28/2007 nsh]
|
|
BOOL CArcStairDlg::m_bgroupStatus=FALSE;
|
|
IMPLEMENT_DYNAMIC(CArcStairDlg, CBaseStairDlg)
|
|
CArcStairDlg::CArcStairDlg(CWnd* pParent /*=NULL*/)
|
|
: CBaseStairDlg(CArcStairDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CArcStairDlg)
|
|
//}}AFX_DATA_INIT
|
|
//SetNeedCapBtn(TRUE);
|
|
/*m_groups.Append(&m_group1);
|
|
m_groups.Append(&m_group2);
|
|
m_groups.Append(&m_group3);*/
|
|
//初始话
|
|
m_bEdit=FALSE;//处于非编辑状态
|
|
m_pBakObj=NULL;//为空状态
|
|
}
|
|
CArcStairDlg::~CArcStairDlg()
|
|
{
|
|
if (m_bEdit)
|
|
delete m_pBakObj;//这个地方是不是有问题
|
|
}
|
|
AcDbEntity *
|
|
CArcStairDlg::NewObject()
|
|
{
|
|
TDbArcStair *pEnt;
|
|
if (m_pBakObj==NULL)
|
|
{
|
|
pEnt=new TDbArcStair;
|
|
pEnt->setLayer(InitLayer(LAY_STAIR));
|
|
return pEnt;
|
|
}
|
|
else
|
|
{
|
|
return (AcDbEntity*)(m_pBakObj->clone());
|
|
}
|
|
return pEnt;
|
|
}
|
|
|
|
|
|
void CArcStairDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CBaseStairDlg::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CArcStairDlg)
|
|
DDX_Control(pDX,IDC_GROUP3,m_group);
|
|
DDX_GroupStatus(pDX,IDC_GROUP3,m_bgroupStatus);
|
|
DDX_Text(pDX, IDC_STARTANGLE, m_strStartAngle);
|
|
DDX_Text(pDX, IDC_SWEEPANGLE, m_strSweepAngle);
|
|
DDX_Radio(pDX, IDC_DEASIL, m_nFace);
|
|
DDX_Radio(pDX, IDC_LOCATE_IN, m_nLocate);
|
|
//}}AFX_DATA_MAP
|
|
if (!pDX->m_bSaveAndValidate)
|
|
{
|
|
DDX_Text(pDX, IDC_STAIR_INRADIUS, m_strInRadius);
|
|
DDX_Text(pDX, IDC_STAIR_WIDTH, m_strStairWidth);
|
|
DDX_Text(pDX, IDC_STEP_OUTRADIUS, m_strOutRadius);
|
|
}
|
|
}
|
|
BEGIN_MESSAGE_MAP(CArcStairDlg, CBaseStairDlg)
|
|
//{{AFX_MSG_MAP(CArcStairDlg)
|
|
ON_BN_CLICKED(IDC_BT_STARTANGLE, OnBtStartangle)
|
|
ON_BN_CLICKED(IDC_PICK_RADIUSIN, OnPickRadiusIn)
|
|
ON_BN_CLICKED(IDC_PICK_RADIUSOUT, OnPickRadiusOut)
|
|
ON_EN_KILLFOCUS(IDC_STEP_OUTRADIUS,OnKFRadiusOut)
|
|
ON_EN_KILLFOCUS(IDC_STAIR_INRADIUS,OnKFRadiusIn)
|
|
ON_EN_KILLFOCUS(IDC_STAIR_WIDTH,OnKFStairWidth)
|
|
ON_EN_KILLFOCUS(IDC_SWEEPANGLE,OnKFSweepAngle)
|
|
ON_EN_KILLFOCUS(IDC_STARTANGLE,OnKFStartAngle)
|
|
ON_EN_CHANGE(IDC_STEP_OUTRADIUS,OnChangeRadiusOut)
|
|
ON_EN_CHANGE(IDC_STAIR_INRADIUS,OnChangeRadiusIn)
|
|
ON_EN_CHANGE(IDC_STAIR_WIDTH,OnChangeStairWidth)
|
|
ON_EN_CHANGE(IDC_STARTANGLE,OnChangeStartAngle)
|
|
ON_EN_CHANGE(IDC_SWEEPANGLE,OnChangeSweepAngle)
|
|
ON_BN_CLICKED(IDC_DEASIL, UpdateImage)
|
|
ON_BN_CLICKED(IDC_ANTICLOCKWISE, UpdateImage)
|
|
ON_BN_CLICKED(IDC_LOCATE_OUT, OnLocate)
|
|
ON_BN_CLICKED(IDC_LOCATE_IN, OnLocate)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CArcStairDlg
|
|
void CArcStairDlg::OnKFRadiusIn()
|
|
{
|
|
if (GetFocus()!=GetDlgItem(IDCANCEL))
|
|
UpdateEdit(IDC_STAIR_INRADIUS,true);
|
|
}
|
|
void CArcStairDlg::OnKFRadiusOut()
|
|
{
|
|
if (GetFocus()!=GetDlgItem(IDCANCEL))
|
|
UpdateEdit(IDC_STEP_OUTRADIUS,true);
|
|
}
|
|
void CArcStairDlg::OnKFStairWidth()
|
|
{
|
|
if (GetFocus()!=GetDlgItem(IDCANCEL))
|
|
UpdateEdit(IDC_STAIR_WIDTH,true);
|
|
}
|
|
void CArcStairDlg::OnKFStartAngle()
|
|
{
|
|
if (GetFocus()!=GetDlgItem(IDCANCEL))
|
|
UpdateEdit(IDC_STARTANGLE,true);
|
|
}
|
|
void CArcStairDlg::OnKFSweepAngle()
|
|
{
|
|
if (GetFocus()!=GetDlgItem(IDCANCEL))
|
|
UpdateEdit(IDC_SWEEPANGLE,true);
|
|
}
|
|
void CArcStairDlg::OnChangeRadiusIn()
|
|
{
|
|
UpdateEdit(IDC_STAIR_INRADIUS);
|
|
}
|
|
void CArcStairDlg::OnChangeRadiusOut()
|
|
{
|
|
UpdateEdit(IDC_STEP_OUTRADIUS);
|
|
}
|
|
void CArcStairDlg::OnChangeStairWidth()
|
|
{
|
|
UpdateEdit(IDC_STAIR_WIDTH);
|
|
}
|
|
void CArcStairDlg::OnChangeStartAngle()
|
|
{
|
|
UpdateEdit(IDC_STARTANGLE);
|
|
}
|
|
void CArcStairDlg::OnChangeSweepAngle()
|
|
{
|
|
UpdateEdit(IDC_SWEEPANGLE);
|
|
}
|
|
//数据关系:
|
|
//外径变化会引起宽度变化,内径不变;
|
|
//内径变化会引起宽度变化,外径不变;
|
|
//以外径定位,则宽度变化会引起内径变化;以内径定位,则宽度变化会引起外径变化。
|
|
bool CArcStairDlg::UpdateEdit(UINT ctrlID,bool bReportError)
|
|
{
|
|
if (GetSafeHwnd()==NULL)
|
|
return false;
|
|
CEdit *pEdit=(CEdit*)GetDlgItem(ctrlID);
|
|
if (pEdit==NULL)
|
|
return false;
|
|
|
|
static bool bUpdating=false;
|
|
if (bUpdating)
|
|
return false;
|
|
bUpdating=true;
|
|
|
|
CString temp;
|
|
pEdit->GetWindowText(temp);
|
|
bool bContinue=false;
|
|
CDataExchange dxOut(this,false);
|
|
switch(ctrlID)
|
|
{
|
|
case IDC_STAIR_INRADIUS:
|
|
{
|
|
if (_tstof(temp)<_tstof(m_strOutRadius))
|
|
{
|
|
m_strInRadius=temp;
|
|
m_strStairWidth=Dist2Str(_tstof(m_strOutRadius)-_tstof(m_strInRadius));
|
|
DDX_Text(&dxOut,IDC_STAIR_WIDTH,m_strStairWidth);
|
|
UpdateImage();
|
|
}
|
|
else if (bReportError)
|
|
{
|
|
AfxMessageBox(_T("内半径必须小于外半径!"));
|
|
DDX_Text(&dxOut,IDC_STAIR_INRADIUS,m_strInRadius);
|
|
pEdit->SetFocus();
|
|
pEdit->SetSel(0,-1);
|
|
}
|
|
}
|
|
break;
|
|
case IDC_STEP_OUTRADIUS:
|
|
{
|
|
if (_tstof(temp)>_tstof(m_strInRadius))
|
|
{
|
|
m_strOutRadius=temp;
|
|
m_strStairWidth=Dist2Str(_tstof(m_strOutRadius)-_tstof(m_strInRadius));
|
|
DDX_Text(&dxOut,IDC_STAIR_WIDTH,m_strStairWidth);
|
|
UpdateImage();
|
|
}
|
|
else if (bReportError)
|
|
{
|
|
AfxMessageBox(_T("外半径必须大于内半径!"));
|
|
DDX_Text(&dxOut,IDC_STEP_OUTRADIUS,m_strOutRadius);
|
|
pEdit->SetFocus();
|
|
pEdit->SetSel(0,-1);
|
|
}
|
|
}
|
|
break;
|
|
case IDC_STAIR_WIDTH:
|
|
{
|
|
if (m_nLocate)
|
|
{
|
|
if (_tstof(temp)<=_tstof(m_strOutRadius))
|
|
{
|
|
m_strStairWidth=temp;
|
|
m_strInRadius=Dist2Str(_tstof(m_strOutRadius)-_tstof(m_strStairWidth));
|
|
DDX_Text(&dxOut,IDC_STAIR_INRADIUS,m_strInRadius);
|
|
UpdateImage();
|
|
}
|
|
else if (bReportError)
|
|
{
|
|
AfxMessageBox(_T("宽度超过了外径!"));
|
|
DDX_Text(&dxOut,IDC_STAIR_WIDTH,m_strStairWidth);
|
|
pEdit->SetFocus();
|
|
pEdit->SetSel(0,-1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (_tstof(temp)>0)
|
|
{
|
|
m_strStairWidth=temp;
|
|
m_strOutRadius=Dist2Str(_tstof(m_strInRadius)+_tstof(m_strStairWidth));
|
|
DDX_Text(&dxOut,IDC_STEP_OUTRADIUS,m_strOutRadius);
|
|
UpdateImage();
|
|
}
|
|
else if (bReportError)
|
|
{
|
|
AfxMessageBox(_T("宽度太小!"));
|
|
DDX_Text(&dxOut,IDC_STAIR_WIDTH,m_strStairWidth);
|
|
pEdit->SetFocus();
|
|
pEdit->SetSel(0,-1);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case IDC_STARTANGLE:
|
|
{
|
|
m_strStartAngle=temp;
|
|
UpdateImage();
|
|
}
|
|
break;
|
|
case IDC_SWEEPANGLE:
|
|
{
|
|
if (fabs(_tstof(temp))>0.1)
|
|
{
|
|
m_strSweepAngle=temp;
|
|
UpdateImage();
|
|
}
|
|
else if (bReportError)
|
|
{
|
|
AfxMessageBox(_T("圆心角太小!"));
|
|
DDX_Text(&dxOut,IDC_SWEEPANGLE,m_strSweepAngle);
|
|
pEdit->SetFocus();
|
|
pEdit->SetSel(0,-1);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
bContinue=true;
|
|
}
|
|
|
|
bUpdating=false;
|
|
return bContinue?CBaseStairDlg::UpdateEdit(ctrlID,bReportError):true;
|
|
}
|
|
void CArcStairDlg::Dlg2Obj(AcDbEntity *pStep) // 对话框数据传向实体
|
|
{
|
|
CBaseStairDlg::Dlg2Obj(pStep); // 调用公共部分:
|
|
TDbArcStair *pArcStair=TDbArcStair::cast(pStep);
|
|
ASSERT(pArcStair);
|
|
|
|
pArcStair->SetRadiusOut(_tstof(m_strOutRadius));
|
|
pArcStair->SetRadiusIn(_tstof(m_strInRadius));
|
|
pArcStair->SetStartAngle(Ucs2Wcs(_tstof(m_strStartAngle)*PI/180.0));
|
|
if (m_nFace)
|
|
pArcStair->SetSweepAngle(_tstof(m_strSweepAngle) * PI / 180.0);
|
|
else
|
|
pArcStair->SetSweepAngle(- _tstof(m_strSweepAngle) * PI / 180.0);
|
|
//------------------------
|
|
if (m_bEdit)
|
|
{
|
|
delete m_pBakObj;
|
|
m_pBakObj=(TDbArcStair*)(pArcStair->clone());
|
|
}
|
|
//------------------------
|
|
return;
|
|
}
|
|
void CArcStairDlg::Obj2Dlg(const AcDbEntity *pStep) // 实体数据传向对话框
|
|
{
|
|
CBaseStairDlg::Obj2Dlg(pStep); // 调用公共部分
|
|
TDbArcStair *pArcStair=TDbArcStair::cast(pStep);
|
|
// [8/14/2008 nsh]
|
|
//--------------------------------
|
|
m_bEdit=TRUE;
|
|
m_pBakObj=(TDbArcStair*)(pArcStair->clone());//专递值
|
|
//--------------------------------
|
|
ASSERT(pArcStair);
|
|
|
|
double nSweepAngle = ( pArcStair->GetSweepAngle()) * 180.0 / PI;
|
|
m_strStairHeight=Dist2Str(m_nStepNum * _tstof(m_strStepHeight));
|
|
m_strInRadius=Dist2Str(pArcStair->GetRadiusIn());
|
|
m_strOutRadius=Dist2Str(pArcStair->GetRadiusOut());
|
|
m_strStartAngle=Dist2Str( Wcs2Ucs(pArcStair->GetStartAngle()) * 180.0 / PI);
|
|
m_strStairWidth=Dist2Str(pArcStair->GetRadiusOut()-pArcStair->GetRadiusIn());
|
|
if ( nSweepAngle < 0)
|
|
m_nFace = 0;
|
|
else
|
|
m_nFace = 1;
|
|
m_strSweepAngle=Angle2Str(fabs(nSweepAngle));
|
|
return;
|
|
}
|
|
void CArcStairDlg::OnBtStartangle()
|
|
{
|
|
double nStartAngle=_tstof(m_strStartAngle);
|
|
|
|
BeginEditorCommand();
|
|
adsout << _T("\n起始角度") << (const TCHAR *)m_strStartAngle << _T(": ");
|
|
int nRet=ads_getangle(NULL, _T(""), &nStartAngle);
|
|
CompleteEditorCommand();
|
|
|
|
if (nRet==RTNORM)
|
|
{
|
|
CString temp=Angle2Str(nStartAngle * 180.0 / PI);
|
|
CDataExchange dxOut(this,false);
|
|
DDX_Text(&dxOut,IDC_STARTANGLE,temp);
|
|
UpdateEdit(IDC_STARTANGLE,true);
|
|
}
|
|
}
|
|
void CArcStairDlg::OnPickRadiusIn()
|
|
{
|
|
double nRadiusIn = _tstof(m_strInRadius);
|
|
|
|
BeginEditorCommand();
|
|
int nRet=GetDist(_T("\n内圆半径"), nRadiusIn, RSG_NONEG|RSG_NOZERO);
|
|
CompleteEditorCommand();
|
|
|
|
if (nRet==RTNORM)
|
|
{
|
|
CString temp=Dist2Str(nRadiusIn);
|
|
CDataExchange dxOut(this,false);
|
|
DDX_Text(&dxOut,IDC_STAIR_INRADIUS,temp);
|
|
UpdateEdit(IDC_STAIR_INRADIUS,true);
|
|
}
|
|
}
|
|
void CArcStairDlg::OnPickRadiusOut()
|
|
{
|
|
double nRadiusOut = _tstof(m_strOutRadius);
|
|
|
|
BeginEditorCommand();
|
|
int nRet=GetDist(_T("\n外圆半径"), nRadiusOut, RSG_NONEG|RSG_NOZERO);
|
|
CompleteEditorCommand();
|
|
|
|
if (nRet==RTNORM)
|
|
{
|
|
CString temp=Dist2Str(nRadiusOut);
|
|
CDataExchange dxOut(this,false);
|
|
DDX_Text(&dxOut,IDC_STEP_OUTRADIUS,temp);
|
|
UpdateEdit(IDC_STEP_OUTRADIUS,true);
|
|
}
|
|
}
|
|
void CArcStairDlg::OnLocate()
|
|
{
|
|
CDataExchange dxIn(this,true);
|
|
DDX_Radio(&dxIn, IDC_LOCATE_IN, m_nLocate);
|
|
}
|
|
BOOL CArcStairDlg::OnInitDialog()
|
|
{
|
|
CBaseStairDlg::OnInitDialog();
|
|
//m_groups.SetMaxExtent(350);
|
|
AddTip(IDC_LOCATE_OUT,_T("当外圆定位时,修改梯段宽度不影响外径"));
|
|
AddTip(IDC_LOCATE_IN,_T("当内圆定位时,修改梯段宽度不影响内径"));
|
|
AddTip(IDC_PICK_RADIUSOUT,_T("外径变化将使梯段宽度随之变化,而内径保持不变"));
|
|
AddTip(IDC_PICK_RADIUSIN,_T("内径变化将使梯段宽度随之变化,而外径保持不变"));
|
|
AddTip(IDC_STAIR_WIDTH_STATIC,_T("梯段宽度始终等于外径减去内径"));
|
|
return TRUE;
|
|
}
|