// CoordDlg.cpp : 实现文件 // #include "stdafx.h" #include "coorddlg.h" // CCoordDlg 对话框 int CCoordDlg::s_iUnitType=0;//默认为mm M int CCoordDlg::s_iDataType=0;//默认为WCS extern TARCH_IMPEXP BOOL g_bABCoord; //AB标注还是XY标注 extern TARCH_IMPEXP int g_nCoordPrec; extern TARCH_IMPEXP int g_nCoordArrowStyle; // [10/19/2007 nsh] CCoordDlg * CCoordDlg::m_pSelf =NULL;//指向自身的指针 CString CCoordDlg::m_strAngle="45";//初始的角度值 BOOL CCoordDlg::m_bFixAngle =FALSE; //---------------- IMPLEMENT_DYNAMIC(CCoordDlg, CAcUiDialog) CCoordDlg::CCoordDlg(UINT resId,CWnd* pParent /*=NULL*/) : CAcUiDialog(resId, pParent) { m_iABCoord=g_bABCoord; m_iPreci=g_nCoordPrec; m_nArrowStyle=g_nCoordArrowStyle; } CCoordDlg::~CCoordDlg() { } void CCoordDlg::DoDataExchange(CDataExchange* pDX) { CAcUiDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO_UNIT, m_cmbUnit); DDX_Control(pDX, IDC_COMBO_PRECI,m_cmbPreci); DDX_Control(pDX, IDS_TYPE, m_staticType); DDX_CBIndex(pDX, IDC_COMBO_UNIT, s_iUnitType); DDX_CBIndex(pDX, IDC_COMBO_PRECI, m_iPreci); DDX_Text(pDX, IDC_NORTH_ANGLE, m_fAngle); DDX_Radio(pDX, IDC_WCS,s_iDataType); DDX_Radio(pDX, IDC_TYPE_XY,m_iABCoord); // [10/22/2007 nsh] DDX_CBString(pDX,IDC_COMBO1,m_strAngle);//映射角度 DDX_Check(pDX,IDC_CHECK1,m_bFixAngle); //--end-------------- if(!pDX->m_bSaveAndValidate) { if(m_iABCoord==1) m_staticType.SetWindowText(_T(" A= ---- B=")); else m_staticType.SetWindowText(_T(" X= ---- Y=")); GetDlgItem(IDC_PICK_NORTH)->EnableWindow(IsWcsPoint()); GetDlgItem(IDC_NORTH_ANGLE)->EnableWindow(IsWcsPoint()); GetDlgItem(IDC_NORTH_THUMB)->EnableWindow(IsWcsPoint()); GetDlgItem(IDC_REF_POINT)->EnableWindow(!IsRedLinePoint()); } DDX_CBIndex(pDX, IDC_ARROW_STYLE, m_nArrowStyle);// Add by lcf on 20050809 } BOOL CCoordDlg::OnInitDialog() { if(!CAcUiDialog::OnInitDialog()) return FALSE; // [10/22/2007 nsh] this->GetDlgItem(IDC_COMBO1)->EnableWindow(m_bFixAngle); m_cmbUnit.AddString(_T("mm M")); m_cmbUnit.AddString(_T("M M")); m_cmbPreci.AddString(_T("0")); m_cmbPreci.AddString(_T("0.0")); m_cmbPreci.AddString(_T("0.00")); m_cmbPreci.AddString(_T("0.000")); m_cmbPreci.AddString(_T("0.0000")); m_cmbPreci.AddString(_T("0.00000")); m_cmbPreci.AddString(_T("0.000000")); UpdateData(FALSE); return TRUE; } BEGIN_MESSAGE_MAP(CCoordDlg, CAcUiDialog) ON_BN_CLICKED(IDC_TYPE_XY,OnClickRadio) ON_BN_CLICKED(IDC_TYPE_AB,OnClickRadio) ON_BN_CLICKED(IDC_UCS,OnClickRadio) ON_BN_CLICKED(IDC_WCS,OnClickRadio) ON_BN_CLICKED(IDC_REDLINE,OnClickRadio) ON_BN_CLICKED(IDC_REF_POINT, OnRefPoint) ON_BN_CLICKED(IDC_NORTH_THUMB,OnNorthThumb) ON_BN_CLICKED(IDC_PICK_NORTH,OnPickNorth) // [10/22/2007 nsh] ON_BN_CLICKED(IDC_CHECK1,OnClickCheck1) //---end--- END_MESSAGE_MAP() void CCoordDlg::OnNorthThumb() { Entity ent0; BeginEditorCommand(); int nRetCode=ent0.FilterSelect(_T("\n选择指北针:"), RBList(RTDXF0, _T("ATS_NORTHTHUMB"), NULL)); CompleteEditorCommand(); if(nRetCode==RTCAN) return; if(nRetCode==RTNORM) { UpdateData(); ent0.GetData(50, &m_fAngle); m_fAngle=CT_std_angle(m_fAngle)*180/PI; //add tyj 20160901:添加精度设置,防止指北针设置角度与坐标标注显示的北向角度不一致的问题 int luprec, auprec; VERIFY(xg_getvar(_T("LUPREC"), &luprec) == RTNORM && xg_getvar(_T("AUPREC"), &auprec) == RTNORM); if(auprec == 0)//保留整数 { m_fAngle = int(m_fAngle + 0.5); } else { double dPrecisionCompute = 1.0;//计算精度的辅助变量 while(auprec != 0) { dPrecisionCompute = dPrecisionCompute * 10.0; auprec --; } m_fAngle = int((m_fAngle + 0.5/dPrecisionCompute) * dPrecisionCompute)/dPrecisionCompute; } UpdateData(FALSE); } } // modify by lcf on 20050809 void CCoordDlg::OnPickNorth() { BeginEditorCommand(); UpdateData(); int nRetCode; XPoint ptBase; XString sNote; INITGET_BEG(0, _T("S")); sNote<<_T("\n指定第一点或 [选择已有坐标标注确定北向(S)]<") << m_fAngle << _T(">:"); nRetCode=acedGetPoint(NULL,sNote,ptBase); INITGET_END(); if(nRetCode==RTNORM) nRetCode=acedGetAngle(ptBase,_T("\n输入北向的WCS角度<返回>:"), &m_fAngle); if(nRetCode==RTNORM) { m_fAngle=CT_std_angle(m_fAngle)*180/PI; UpdateData(FALSE); } else if(nRetCode==RTKWORD) { RBList mask(RTDXF0, _T("ATS_COORD"), NULL); PickSet ss(SS_FREE); if(SelectEntities(_T("\n请选择两个上华坐标标注确定北向角度<返回>: "), ss, mask)==RTNORM) { if(ss.Length() == 2) { AcGeVector3d vtLoc, vtVal; OPENOBJ_BEGIN(ss[(long)0], AcDb::kForWrite, TDbSymbCoord, pDim1); if(pDim1) { XPoint ptLoc1 = pDim1->GetLocation(); XPoint ptVal1 = pDim1->GetValue(); OPENOBJ_BEGIN(ss[(long)1], AcDb::kForWrite, TDbSymbCoord, pDim2); if(pDim2) { XPoint ptLoc2 = pDim2->GetLocation(); XPoint ptVal2 = pDim2->GetValue(); vtLoc = ptLoc2.AsAcGeVector3d() - ptLoc1.AsAcGeVector3d(); vtVal = ptVal2.AsAcGeVector3d() - ptVal1.AsAcGeVector3d(); m_fAngle = PI/2 - vtLoc.angleTo(vtVal, AcGeVector3d::kZAxis); m_fAngle = CT_std_angle(m_fAngle)*180/PI; UpdateData(FALSE); } OPENOBJ_END(); } OPENOBJ_END(); } } } CompleteEditorCommand(); } void CCoordDlg::OnRefPoint() { PickSet ssAll(SS_FREE); if(ssAll.Get(_T("X"),NULL,NULL,NULL)!=RTNORM) return; UpdateData(); XPoint pt0; BeginEditorCommand(); int nRetCode=ads_getpoint(NULL,_T("\n点取参考点:"),pt0); if(nRetCode!=RTNORM) { CompleteEditorCommand(); return; } if(IsWcsPoint()) pt0=Ucs2Wcs(pt0); while(true) { XPoint pt1=pt0; if(IsWcsPoint()) { pt1.Rotate(PI/2-m_fAngle*PI/180);//转换为北向坐标,add by whl on 050726 adsout<<_T("\n当前北向角度:")<:"); XString sText(256); nRetCode=ads_getstring(0, _T(""), sText); if(nRetCode!=RTNORM) break; if(!!sText) if(_stscanf(sText,_T("%lf,%lf"), &pt1.x,&pt1.y)!=2) { adsout << _T("\n请按格式x,y正确输入坐标!"); continue; } if(IsUcsPoint())//移动用户坐标系 { XPushVar vOsMode(_T("OSMODE"), 0); XPoint ptOrg=pt0-pt1; SHads_command(RTSTR,_T("UCS"),RTSTR,_T("M"),RT3DPOINT,&ptOrg,RTNONE); } else//移动世界坐标系 { XPushVar vOsMode(_T("OSMODE"), 0); //输入北向坐标转化为世界坐标,add by whl on 050726 pt1.Rotate(-PI/2+m_fAngle*PI/180); // Zyu modify on 100726,支持64位 //SHads_command(RTSTR,_T("MOVE"),RTPICKS,(long *)ssAll,RTSTR,_T(""),RT3DPOINT,&pt0,RT3DPOINT,&pt1,RTNONE); SHads_command(RTSTR,_T("MOVE"),RTPICKS,(TLong_ptr *)ssAll,RTSTR,_T(""),RT3DPOINT,&pt0,RT3DPOINT,&pt1,RTNONE); SHads_command(RTSTR, _T("PAN"), RT3DPOINT, &pt1, RT3DPOINT, &pt0, RTNONE); } break; } CompleteEditorCommand(); } void CCoordDlg::OnClickRadio() { UpdateData(); UpdateData(FALSE); } void CCoordDlg::OnOK() { CAcUiDialog::OnOK(); g_bABCoord=m_iABCoord; g_nCoordPrec=m_iPreci; g_nCoordArrowStyle=m_nArrowStyle; DocSetMeterUnitDraw(CCoordDlg::s_iUnitType); if(CCoordDlg::s_iUnitType==1) DocSetMeterUnitDim(TRUE); } // [10/22/2007 nsh] void CCoordDlg::OnClickCheck1() { if(m_bFixAngle) m_bFixAngle=FALSE; else m_bFixAngle =TRUE; this->GetDlgItem(IDC_COMBO1)->EnableWindow(m_bFixAngle); } //--end--