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