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

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;
}