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

282 lines
7.1 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--