You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
GCS-GISControlDlg-for-981A-.../ModifyLinePointDlg.cpp

397 lines
10 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// ModifyLinePointDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "ModifyLinePointDlg.h"
#include "afxdialogex.h"
#include <cstdio>
#include "string"
#include <iostream>
#include <sstream>
#include <regex>
// CModifyLinePointDlg 对话框
IMPLEMENT_DYNAMIC(CModifyLinePointDlg, CBCGPDialog)
CModifyLinePointDlg::CModifyLinePointDlg(CWnd* pParent /*=NULL*/)
: CBCGPDialog(CModifyLinePointDlg::IDD, pParent)
, m_bCirclingPoint(0)
{
EnableVisualManagerStyle(TRUE, TRUE);
m_gLat = 0.0;
m_gLon = 0.0;
m_bCheck = false;
splitSymbol = "EWNSs+\/-,;°度′'’分\""”秒、,; ";
dSymbol = "°";
mSymbol = "";
sSymbol = "\"";
m_bCirclingPointVisible = true;
m_selectedPointID = 0;
}
CModifyLinePointDlg::~CModifyLinePointDlg()
{
}
void CModifyLinePointDlg::DoDataExchange(CDataExchange* pDX)
{
CBCGPDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO_TYPE, m_PositionType);
DDX_Control(pDX, IDC_EDIT_LON, m_strLon);
DDX_Control(pDX, IDC_EDIT_LAT, m_strLat);
DDX_Control(pDX, IDC_COMBO_POINTID, m_PointID);
}
BEGIN_MESSAGE_MAP(CModifyLinePointDlg, CBCGPDialog)
ON_CBN_SELCHANGE(IDC_COMBO_PT, &CModifyLinePointDlg::OnCbnSelchangeComboPt)
ON_CBN_SELCHANGE(IDC_COMBO_TYPE, &CModifyLinePointDlg::OnCbnSelchangeComboType)
ON_BN_CLICKED(IDOK, &CModifyLinePointDlg::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &CModifyLinePointDlg::OnBnClickedCancel)
ON_BN_CLICKED(IDC_SETCIRCLINGPOINT, &CModifyLinePointDlg::OnBnClickedSetcirclingpoint)
ON_EN_KILLFOCUS(IDC_EDIT_LON, &CModifyLinePointDlg::OnEnKillfocusEditLon)
ON_EN_KILLFOCUS(IDC_EDIT_LAT, &CModifyLinePointDlg::OnEnKillfocusEditLat)
ON_CBN_SELCHANGE(IDC_COMBO_POINTID, &CModifyLinePointDlg::OnCbnSelchangeComboPointid)
END_MESSAGE_MAP()
//设置盘旋点按钮是否可见
void CModifyLinePointDlg::SetCirclingPointRBTNVisible(bool isVisible)
{
m_bCirclingPointVisible = isVisible;
};
//勾选盘旋点
void CModifyLinePointDlg::CheckedCirclingPoint()
{
m_bCheck = true;
};
void CModifyLinePointDlg::SetLonLat(double lon,double lat)
{
m_gLat = lat;
m_gLon = lon;
}
void CModifyLinePointDlg::GetLonLat(double &lon,double &lat, int &pointID)
{
lon = m_gLon;
lat = m_gLat;
pointID = m_selectedPointID;
}
// 经纬度转字符串度分秒
void CModifyLinePointDlg::getDMSString(double lon,double lat,string &str_lon,string &str_lat)
{
int lon_d,lon_m,lat_d,lat_m;
double lon_s,lat_s;
angle.DegtoDms(lon,lon_d,lon_m,lon_s);
angle.DegtoDms(lat,lat_d,lat_m,lat_s);
string str_lat_s = angle.DoubleToString(lat_s,4);
string str_lon_s = angle.DoubleToString(lon_s,4);
str_lon = angle.IntToString(lon_d) + dSymbol + angle.IntToString(lon_m) + mSymbol + str_lon_s + sSymbol;
str_lat = angle.IntToString(lat_d) + dSymbol + angle.IntToString(lat_m) + mSymbol + str_lat_s + sSymbol;
}
double CModifyLinePointDlg::getEditValue(const int ID)
{
double value = -200.0;
CString cstr;
GetDlgItemText(ID,cstr);
int typeID = m_PositionType.GetCurSel();
if (typeID==0) //度
{
value = _tstof(cstr);
}
else if (typeID==1) //度分秒
{
vector<string> vec_str = angle.split(cstr.GetBuffer(),splitSymbol);
int d = stoi(vec_str.at(0));
int m = stoi(vec_str.at(1));
double s = stod(vec_str.at(2));
angle.DmstoDeg(d,m,s,value);
}
return value;
}
bool CModifyLinePointDlg::IsCirclingPoint()
{
return m_bCirclingPoint;
}
void CModifyLinePointDlg::InitEidtText()
{
string str_lon,str_lat;
if (posTypeID==0) //度
{
str_lon = angle.DoubleToString(m_gLon,7);
str_lat = angle.DoubleToString(m_gLat,7);
}
else if (posTypeID == 1) //度分秒
{
getDMSString(m_gLon,m_gLat,str_lon,str_lat);
}
// 编辑框中默认显示的经纬度
SetDlgItemText(IDC_EDIT_LON,str_lon.c_str());
SetDlgItemText(IDC_EDIT_LAT,str_lat.c_str());
}
bool CModifyLinePointDlg::checkLon(string strLon,int type)
{
if (type==0) //度
{
string str_match = "^\\-?(\\d{1,2}\\.?\\d*|1[0-7]?\\d{1}\\.?\\d*|180\\.?0*)$";
regex regexNumber1(str_match);
return regex_match(strLon,regexNumber1);
}
else if (type==1) //,xx;xx;xx.xx
{
/*
string str_match = "^[-]?((\\d|[1-9]\\d|1[0-7]\\d)[;](\\d|[0-5]\\d)[;](\\d|[0-5]\\d)(\\.\\d{1,6})?[;]?$)";
regex regexNumber1(str_match);
bool b = regex_match(strLon,regexNumber1);*/
wstring str_match = L"^[EW+-]?((\\d|[1-9]\\d|1[0-7]\\d)[s\\-,;°度/、;](\\d|[0-5]\\d)[s\\-,;/′、;'’ 分](\\d|[0-5]\\d)(\\.\\d{1,})?[s\\-,;/\""” 秒]?$)";
wregex regexNumber1(str_match);
return regex_match(angle.String2WString(strLon),regexNumber1);
}
}
bool CModifyLinePointDlg::checkLat(string strLat,int type)
{
if (type==0) //度
{
string sm = "^\\-?([0-8]?\\d{1}\\.?\\d*|90\\.?0*)$";
regex regexNumber(sm);
return regex_match(strLat,regexNumber);
}
else if (type==1) //,xx;xx;xx.xx
{
/*
string sm = "^[-]?((\\d|[1-8]\\d)[;](\\d|[0-5]\\d)[;](\\d|[0-5]\\d)(\\.\\d{1,6})?[;]?$)";
regex regexNumber(sm);
return regex_match(strLat,regexNumber);*/
wstring str_match2 = L"^[NS+-]?((\\d|[1-8]\\d)[s\\-,;°度/、;](\\d|[0-5]\\d)[s\\-,;/′、;'’ 分](\\d|[0-5]\\d)(\\.\\d{1,})?[s\\-,;/\""” 秒]?$)";
wregex regexNumber2(str_match2);
return regex_match(angle.String2WString(strLat),regexNumber2);
}
}
// CModifyLinePointDlg 消息处理程序
BOOL CModifyLinePointDlg::OnInitDialog()
{
CBCGPDialog::OnInitDialog();
CenterWindow();
m_PositionType.AddString(_T("度分秒"));
m_PositionType.AddString(_T(""));
m_PositionType.SetCurSel(0);
posTypeID = 0;
lastTypeID = 0;
m_bCirclingPoint = 0;
// 编辑框中默认显示第一项的文字“谷歌”
InitEidtText();
//SetDlgItemText(IDC_EDIT_LON,_T("119.623546"));
//SetDlgItemText(IDC_EDIT_LAT,_T("32.562147"));
GetDlgItem(IDC_SETCIRCLINGPOINT)->ShowWindow(m_bCirclingPointVisible);
if (m_bCheck) //勾选盘旋点
{
((CButton *)GetDlgItem(IDC_SETCIRCLINGPOINT))->SetCheck(true);
m_bCheck = true;
}
//在下拉列表中添加航点号
CString cstr;
for (int i=0;i<m_editLineDataGroup.pointNum;i++)
{
cstr.Format(_T("%d"), i+1);
m_PointID.InsertString(i,cstr);
}
m_PointID.SetCurSel(m_selectedPointID-1);
cstr.Format(_T("%f"), m_editLineDataGroup.pts[m_selectedPointID-1].dX);
SetDlgItemText(IDC_EDIT_LON,cstr);
cstr.Format(_T("%f"), m_editLineDataGroup.pts[m_selectedPointID-1].dY);
SetDlgItemText(IDC_EDIT_LAT,cstr);
return TRUE;
}
void CModifyLinePointDlg::OnCbnSelchangeComboPt()
{
// TODO: 在此添加控件通知处理程序代码
}
// 坐标类型改变事件
void CModifyLinePointDlg::OnCbnSelchangeComboType()
{
CString strLat,strLon;
m_strLat.GetWindowTextA(strLat);
m_strLon.GetWindowTextA(strLon);
posTypeID = m_PositionType.GetCurSel();
if (lastTypeID == posTypeID) //类型未改变,不执行坐标变换
{
return;
}
else
{
lastTypeID = posTypeID;
}
if (posTypeID==0) //度
{
double tarLon,tarLat;
vector<string> vec_lat = angle.split(strLat.GetBuffer(),splitSymbol);
vector<string> vec_lon = angle.split(strLon.GetBuffer(),splitSymbol);
int lon_d = stoi(vec_lon.at(0));
int lon_m = stoi(vec_lon.at(1));
double lon_s = stod(vec_lon.at(2));
angle.DmstoDeg(lon_d,lon_m,lon_s,tarLon);
int lat_d = stoi(vec_lat.at(0));
int lat_m = stoi(vec_lat.at(1));
double lat_s = stod(vec_lat.at(2));
angle.DmstoDeg(lat_d,lat_m,lat_s,tarLat);
SetDlgItemText(IDC_EDIT_LON,angle.DoubleToString(tarLon).c_str());
SetDlgItemText(IDC_EDIT_LAT,angle.DoubleToString(tarLat).c_str());
}
else if (posTypeID==1) //度分秒
{
double lat,lon;
lat = _tstof(strLat);
lon = _tstof(strLon);
string str_lat,str_lon;
getDMSString(lon,lat,str_lon,str_lat);
SetDlgItemText(IDC_EDIT_LON,str_lon.c_str());
SetDlgItemText(IDC_EDIT_LAT,str_lat.c_str());
}
}
//确认按钮
void CModifyLinePointDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
m_gLon = getEditValue(IDC_EDIT_LON);
m_gLat = getEditValue(IDC_EDIT_LAT);
// 编辑框中默认显示的经纬度
//SetDlgItemText(IDC_EDIT_LON,str_lon.c_str());
//SetDlgItemText(IDC_EDIT_LAT,str_lat.c_str());
m_bCirclingPoint = ((CButton *)GetDlgItem(IDC_SETCIRCLINGPOINT))->GetCheck();
CBCGPDialog::OnOK();
}
void CModifyLinePointDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
CBCGPDialog::OnCancel();
//CBCGPDialog::OnClose();
}
void CModifyLinePointDlg::OnBnClickedSetcirclingpoint()
{
if (!m_bCheck)
{
((CButton *)GetDlgItem(IDC_SETCIRCLINGPOINT))->SetCheck(true);
m_bCheck = true;
}
else
{
((CButton *)GetDlgItem(IDC_SETCIRCLINGPOINT))->SetCheck(false);
m_bCheck = false;
}
}
void CModifyLinePointDlg::OnEnKillfocusEditLon()
{
// TODO: 在此添加控件通知处理程序代码
CString cstr;
GetDlgItemText(IDC_EDIT_LON,cstr);
int typeID = m_PositionType.GetCurSel();
bool b = checkLon(cstr.GetBuffer(),typeID);
if (!b)
{
BCGPMessageBox("经度范围或格式有误,请重新输入!");
m_strLon.SetFocus();
}
}
void CModifyLinePointDlg::OnEnKillfocusEditLat()
{
// TODO: 在此添加控件通知处理程序代码
CString cstr;
GetDlgItemText(IDC_EDIT_LAT,cstr);
int typeID = m_PositionType.GetCurSel();
bool b = checkLat(cstr.GetBuffer(),typeID);
if (!b)
{
BCGPMessageBox("纬度范围或格式有误,请重新输入!");
m_strLat.SetFocus();
}
}
void CModifyLinePointDlg::SetSelectedPointID(int PointID){
m_selectedPointID = PointID + 1;
//m_selectedPointID = PointID;
}
// 选择航点下拉列表变化时触发
void CModifyLinePointDlg::OnCbnSelchangeComboPointid()
{
// TODO: 在此添加控件通知处理程序代码
m_selectedPointID = m_PointID.GetCurSel() + 1;
TRACE(_T("当前选中航点ID: %d \n"),m_selectedPointID);
//修改经纬度文本框的值
CString cstr;
if(posTypeID==0)
{ //度
cstr.Format(_T("%f"), m_editLineDataGroup.pts[m_selectedPointID-1].dX);
SetDlgItemText(IDC_EDIT_LON,cstr);
cstr.Format(_T("%f"), m_editLineDataGroup.pts[m_selectedPointID-1].dY);
SetDlgItemText(IDC_EDIT_LAT,cstr);
}
else if(posTypeID==1)
{ // 度分秒
string str_lon, str_lat;
getDMSString(m_editLineDataGroup.pts[m_selectedPointID-1].dX, m_editLineDataGroup.pts[m_selectedPointID-1].dY,str_lon, str_lat);
SetDlgItemText(IDC_EDIT_LON,str_lon.c_str());
SetDlgItemText(IDC_EDIT_LAT,str_lat.c_str());
}
}