282 lines
7.3 KiB
C++
282 lines
7.3 KiB
C++
// 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当前北向角度:")<<Angle2Str(m_fAngle)<<_T("度");
|
|
}
|
|
adsout << _T("\n输入坐标值<") <<pt1.x<< _T(",") <<pt1.y << _T(">:");
|
|
|
|
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<int> vOsMode(_T("OSMODE"), 0);
|
|
XPoint ptOrg=pt0-pt1;
|
|
SHads_command(RTSTR,_T("UCS"),RTSTR,_T("M"),RT3DPOINT,&ptOrg,RTNONE);
|
|
}
|
|
else//移动世界坐标系
|
|
{
|
|
XPushVar<int> 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--
|