西安80平面坐标转WGS84球面坐标

初版本:http://www.javashuo.com/article/p-ujqexkkp-es.htmlgit

第二版本:首先打开一个dwg图纸,而后在dwg上拾取一段有标注的多段线,把该多段线上的点的xy坐标转化成平面坐标,导出到kml文件里面,该kml文件能够导入到谷歌地图等里面成图.api

acrxEntryPoint.cppapp

virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
	AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
		
	// 自动加载dwg
	CDwgDataToXml::OnLoadDWG();
	return (retCode) ;
}

static void HHCDwgPt2XmlApp(void)
{
	CCoordManageDlg pDlg;
	pDlg.DoModal();
}

static void HHOpenDwg(void)
{
	CDwgDataToXml::OnLoadDWG();
}

IMPLEMENT_ARX_ENTRYPOINT(CDwgPt2KmlApp)
//注册命令
ACED_ARXCOMMAND_ENTRY_AUTO(CDwgPt2KmlApp,HH, OpenDwg,		HHOPENDWG,	ACRX_CMD_TRANSPARENT, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CDwgPt2KmlApp,HH, CDwgPt2XmlApp, HHDCKML,	ACRX_CMD_TRANSPARENT, NULL)//坐标转换

具体实现:函数

坐标转换界面:ui

CoordManageDlg.hthis

#pragma once
#include "Resource.h"
#include "DHCT.h"
#include <vector>

class CKmlXmlns;
class CCoordTransArr;
struct CPoleData;

struct CSevenParam
{
	CString m_strCur;
	CString m_strTar;
	double m_dDX;
	double m_dDY;
	double m_dDZ;
	double m_dRX;
	double m_dRY;
	double m_dRZ;
	double m_dK;
};

// CCoordManageDlg		坐标转换	对话框			2017.1.18		
class CCoordManageDlg : public CDialog
{
	DECLARE_DYNAMIC(CCoordManageDlg)
public:
	CCoordManageDlg(CWnd* pParent = NULL);   // 标准构造函数
	virtual ~CCoordManageDlg();

// 对话框数据
	enum { IDD = IDD_DLG_COORD_MG };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
	DECLARE_MESSAGE_MAP()
	virtual BOOL OnInitDialog();
	afx_msg void OnBnClickedBtnGetline();//拾取线路
	afx_msg void OnBnClickedBtnSet();//设置
	afx_msg void OnCbnSelchangeCmbTarcoordsystem();//目标坐标系改变
	afx_msg void OnCbnSelchangeCmbDecimalsnum();//小数点
	afx_msg void OnLvnEndlabeleditListCoord(NMHDR *pNMHDR, LRESULT *pResult);//edit编辑结束
	afx_msg void OnBnClickedBtnCoordtrans();//坐标转换
	afx_msg void OnBnClickedOk();//导出klm
	afx_msg void OnBnClickedBtnCoord();//导出东北坐标
	afx_msg void OnNMRClickListCoord(NMHDR *pNMHDR, LRESULT *pResult);//右键菜单
	afx_msg void OnMenuClickedAdd();//添加
	afx_msg void OnMenuClickedModify();//修改
	afx_msg void OnMenuClickDelete();//删除
private:
	//初始化下拉框
	void InitCombox();
	//初始化参数转换
	void InitSevenParam();
	//初始化表头
	void InitListHead();
	//初始化xy坐标
	void InitListYX(bool bIsUpData = false);
	//初始化经纬度坐标
	void InitListBL();

	//加载配置文件,获得转换参数
	void LoadCoordParameter();
	//保存7参数
	void SaveSevenParam();

	//写入xml文件
	bool WriteXml(CKmlXmlns& arrPointData);
	//获取用户选择的路径
	bool GetUserSelectDir(CString & strPath);
private:
	CComboBox m_cmbCurCoordSystem;//当前坐标系
	CComboBox m_cmbCoordType;	  //坐标类型
	CComboBox m_cmbDecimalsNum;	  //保留小数位数
	CComboBox m_cmbCoordStyle;	  //坐标风格
	CEdit m_editLongitude;		  //中央经线
	CStatic m_staticLongitude;	  //中央经线
	CStatic m_staticZoning;		  //投影分带
	CComboBox m_cmbZoning;		  //投影分带
	
	CComboBox m_cmbTarCoordSystem;//目标坐标系
	CComboBox m_cmbTarCoordType;  //坐标类型
	CComboBox m_cmbCoordParameter;//转换参数

	CEdit m_editLineName;//线路名称
	CListCtrl m_listCoord;
	std::vector<CPoleData> m_vecPoleData;//点位信息
	std::map<CString,CSevenParam> m_mapSevenParam;//七参数
};

CoordManageDlg.cpp.net

// CoordManageDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "CoordManageDlg.h"
#include "afxdialogex.h"
#include "PrjStruct.h"
#include "DwgDataToXml.h"
#include "CoordEditDlg.h"
#include "ParameterManageDlg.h"
#include "rxmfcapi.h"
#include "Fun.h"
#include "ExcelReaderLibXl.h"

// CCoordManageDlg 对话框
IMPLEMENT_DYNAMIC(CCoordManageDlg, CDialog)
CCoordManageDlg::CCoordManageDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCoordManageDlg::IDD, pParent)
{

}

CCoordManageDlg::~CCoordManageDlg()
{
}

void CCoordManageDlg::DoDataExchange(CDataExchange* pDX)
{
	__super::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_CMB_CURCOORDSYSTEM, m_cmbTarCoordSystem );
	DDX_Control(pDX, IDC_CMB_TARCOORDSYSTEM, m_cmbCurCoordSystem);
	DDX_Control(pDX, IDC_CMB_COORDTYPE, m_cmbCoordType);
	DDX_Control(pDX, IDC_CMB_DECIMALSNUM, m_cmbDecimalsNum);
	DDX_Control(pDX, IDC_CMB_COORDSTYLE, m_cmbCoordStyle);
	DDX_Control(pDX, IDC_STATIC_LONGITUDE, m_staticLongitude);
	DDX_Control(pDX, IDC_EDIT_LONGITUDE, m_editLongitude);
	DDX_Control(pDX, IDC_STATIC_ZONING, m_staticZoning);
	DDX_Control(pDX, IDC_CMB_ZONING, m_cmbZoning);
	DDX_Control(pDX, IDC_LIST_COORD, m_listCoord);
	DDX_Control(pDX, IDC_CMB_TARCOORDTYPE, m_cmbTarCoordType);
	DDX_Control(pDX, IDC_CMB_COORDPARAMETER, m_cmbCoordParameter);
	DDX_Control(pDX, IDC_EDIT_NAME, m_editLineName);
}

BEGIN_MESSAGE_MAP(CCoordManageDlg, CDialog)
	ON_BN_CLICKED(IDOK, &CCoordManageDlg::OnBnClickedOk)
	ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_COORD, &CCoordManageDlg::OnLvnEndlabeleditListCoord)
	ON_CBN_SELCHANGE(IDC_CMB_TARCOORDSYSTEM, &CCoordManageDlg::OnCbnSelchangeCmbTarcoordsystem)
	ON_BN_CLICKED(IDC_BTN_GETLINE, &CCoordManageDlg::OnBnClickedBtnGetline)
	ON_BN_CLICKED(IDC_BTN_COORDTRANS, &CCoordManageDlg::OnBnClickedBtnCoordtrans)
	ON_BN_CLICKED(IDC_BTN_SET, &CCoordManageDlg::OnBnClickedBtnSet)
	ON_NOTIFY(NM_RCLICK, IDC_LIST_COORD, &CCoordManageDlg::OnNMRClickListCoord)
	ON_COMMAND(ID_Add, &CCoordManageDlg::OnMenuClickedAdd)
	ON_COMMAND(ID_MODIFY, &CCoordManageDlg::OnMenuClickedModify)
	ON_COMMAND(ID_DELETE, &CCoordManageDlg::OnMenuClickDelete)
	ON_BN_CLICKED(IDC_BTN_COORD, &CCoordManageDlg::OnBnClickedBtnCoord)
	ON_CBN_SELCHANGE(IDC_CMB_DECIMALSNUM, &CCoordManageDlg::OnCbnSelchangeCmbDecimalsnum)
END_MESSAGE_MAP()

// CCoordManageDlg 消息处理程序
BOOL CCoordManageDlg::OnInitDialog()
{
	__super::OnInitDialog();

	//加载配置文件,获得转换参数
	LoadCoordParameter();
	//初始化下拉框
	InitCombox();
	//初始化表头
	InitListHead();
	
	return TRUE;  
}

void CCoordManageDlg::OnBnClickedOk()
{
	UpdateData(FALSE);

	CString strLineName;
	m_editLineName.GetWindowText(strLineName);
	if (strLineName.IsEmpty())
	{
		MessageBox(_T("请填写当前线路的名称!"), _T("提示框"), MB_OK | MB_ICONHAND ); 
		return;
	}

	CString strName;
	CString strCoord;
	CString strTempName;
	CString strTempX;
	CString strTempY;
	CString strtempCoord;
	for (int nRow = 0; nRow < m_listCoord.GetItemCount(); ++nRow)
	{
		strTempName = m_listCoord.GetItemText(nRow,0);
		strTempX = m_listCoord.GetItemText(nRow,3);
		strTempY = m_listCoord.GetItemText(nRow,4);
		if (strTempX.IsEmpty() || strTempY.IsEmpty())
		{
			AfxMessageBox(_T("还未进行坐标转换!"));
			return;
		}
		strtempCoord.Format(_T("%s,%s,0"),strTempX,strTempY);

		if (!strName.IsEmpty())
			strName += _T(";");
		strName += strTempName;

		if (!strCoord.IsEmpty())
			strCoord += _T(" ");
		strCoord += strtempCoord;
	}

	CKmlXmlns arrPointData;
	arrPointData.m_Document.m_Placemark.m_strName = strLineName;
	arrPointData.m_Document.m_Placemark.m_Point.m_strName = strName;
	arrPointData.m_Document.m_Placemark.m_Point.m_strCoord = strCoord;

	//写入kml文件
	WriteXml(arrPointData);

	__super::OnOK();
}

bool CCoordManageDlg::GetUserSelectDir( CString & strPath )
{
	strPath ='\0';
	TCHAR szPath[MAX_PATH];
	BROWSEINFO br;
	ITEMIDLIST * pItem; 
	br.hwndOwner = GetSafeHwnd();
	br.iImage = 0;
	br.pszDisplayName = 0;
	br.lParam = 0 ;
	br.lpfn = 0 ;
	br.lpszTitle = _T("请选择存放kml路径");
	br.pidlRoot = 0 ;
	br.ulFlags = BIF_RETURNONLYFSDIRS|BIF_USENEWUI;
	pItem = SHBrowseForFolder(&br);
	if (SHGetPathFromIDList(pItem,szPath) != TRUE)
	{
		return false;
	}

	strPath = szPath;
	return true;
}

bool CCoordManageDlg::WriteXml(CKmlXmlns& arrPointData)
{
	CString strPath;
	if (!GetUserSelectDir(strPath))
		return true;
	
	CTime timeCurr = CTime::GetCurrentTime();
	CString strXmlName;
	strXmlName.Format(_T("\\桩位点数据%d%d%d%d%d%d.kml"),timeCurr.GetYear(),timeCurr.GetMonth(),timeCurr.GetDay(),
		timeCurr.GetHour(),timeCurr.GetMinute(),timeCurr.GetSecond());
	strPath+=strXmlName;
	strPath.Replace(_T("\\\\"), _T("\\"));

	if(arrPointData.SaveXMLFile(strPath))
		AfxMessageBox(_T("导出成功!"));
	else 
		AfxMessageBox(_T("写kml失败!"));

	return true;
}

void CCoordManageDlg::InitCombox()
{
	//当前坐标系
	int nIndex = m_cmbCurCoordSystem.AddString(_T("1954北京坐标系"));
	m_cmbCurCoordSystem.SetItemData(nIndex,1);
	nIndex = m_cmbCurCoordSystem.AddString(_T("1980西安坐标系"));
	m_cmbCurCoordSystem.SetItemData(nIndex,2);
	nIndex = m_cmbCurCoordSystem.AddString(_T("WGS84坐标系"));
	m_cmbCurCoordSystem.SetItemData(nIndex,3);
	m_cmbCurCoordSystem.SetCurSel(1);

	//坐标风格
	nIndex = m_cmbCoordStyle.AddString(_T("米"));
	m_cmbCoordStyle.SetItemData(nIndex,1);
	m_cmbCoordStyle.SetCurSel(0);

	//中央经线
	m_editLongitude.SetWindowText(_T("111"));

	//坐标类型
	nIndex = m_cmbCoordType.AddString(_T("平面坐标"));
	m_cmbCoordType.SetItemData(nIndex,1);
	nIndex = m_cmbCoordType.AddString(_T("大地坐标"));
	m_cmbCoordType.SetItemData(nIndex,2);
	m_cmbCoordType.SetCurSel(0);

	//保留小数
	CString strNum;
	for (int nNum = 0; nNum < 7; ++nNum)
	{
		strNum.Format(_T("%d"), nNum);
		nIndex = m_cmbDecimalsNum.AddString(strNum);
		m_cmbDecimalsNum.SetItemData(nIndex,nNum);
	}
	m_cmbDecimalsNum.SetCurSel(4);

	//投影分带
	nIndex = m_cmbZoning.AddString(_T("3度分带"));
	m_cmbZoning.SetItemData(nIndex,1);
	nIndex = m_cmbZoning.AddString(_T("6度分带"));
	m_cmbZoning.SetItemData(nIndex,2);
	m_cmbZoning.SetCurSel(0);

	//目标坐标系
	nIndex = m_cmbTarCoordSystem.AddString(_T("WGS84坐标系"));
	m_cmbTarCoordSystem.SetItemData(nIndex,1);
	m_cmbTarCoordSystem.SetCurSel(0);

	//坐标类型
	nIndex = m_cmbTarCoordType.AddString(_T("大地坐标"));
	m_cmbTarCoordType.SetItemData(nIndex,1);
	m_cmbTarCoordType.SetCurSel(0);

	//转换参数
	InitSevenParam();
}

void CCoordManageDlg::InitListHead()
{
	CRect rect; 
 	m_listCoord.GetClientRect(&rect);
	m_listCoord.SetExtendedStyle(m_listCoord.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);

	m_listCoord.InsertColumn(0, _T("桩/塔名"), LVCFMT_CENTER, rect.Width()/5, 0);
	m_listCoord.InsertColumn(1, _T("东坐标" ), LVCFMT_CENTER, rect.Width()/5, 1);   
	m_listCoord.InsertColumn(2, _T("北坐标"	), LVCFMT_CENTER, rect.Width()/5, 2);
	m_listCoord.InsertColumn(3, _T("经度"   ), LVCFMT_CENTER, rect.Width()/5, 3);   
	m_listCoord.InsertColumn(4, _T("纬度"	), LVCFMT_CENTER, rect.Width()/5, 4); 
}

void CCoordManageDlg::OnCbnSelchangeCmbTarcoordsystem()
{
	
}

void CCoordManageDlg::OnBnClickedBtnGetline()
{
	// 隐藏对话框
	acedGetAcadFrame()->EnableWindow(TRUE);
	ShowWindow(SW_HIDE);

	m_vecPoleData.clear();
	CDwgDataToXml::Inlet(m_vecPoleData);
	// 显示对话框
	acedGetAcadFrame()->EnableWindow(FALSE);
	ShowWindow(SW_SHOW);	
	EnableWindow(TRUE);
	if (m_vecPoleData.size() > 0)
		InitListYX();
}

void CCoordManageDlg::InitListYX( bool bIsUpData)
{
	//小数点位数
	CString strNum;
	m_cmbDecimalsNum.GetWindowText(strNum);
	int nNum = _ttoi(strNum);
	CString strRow;
	CString strPoint;
	for (int nRow = 0; nRow < m_vecPoleData.size();++nRow)
	{
		CPoleData poleData = m_vecPoleData[nRow];
		if (!bIsUpData)
		{
			strRow.Format(_T("%d"),nRow);
			m_listCoord.InsertItem(nRow, strRow); 
		}
		m_listCoord.SetItemText(nRow, 0, poleData.strName); 
		strPoint.Format(_T("%.*f"),nNum,poleData.ptPolePoint.x);
		m_listCoord.SetItemText(nRow, 1, strPoint); 
		strPoint.Format(_T("%.*f"),nNum,poleData.ptPolePoint.y);
		m_listCoord.SetItemText(nRow, 2, strPoint); 
	} 
}

void CCoordManageDlg::InitListBL()
{
	DHCOORDTRANSFORMPARAM mParam;
	CString strTemp;
	m_cmbCurCoordSystem.GetWindowText(strTemp);
	if (_T("1954北京坐标系") == strTemp)
		mParam.nCoordMode = DHE3_COORMODE_BJ54;
	else if (_T("WGS84坐标系") == strTemp)
		mParam.nCoordMode = DHE3_COORMODE_WGS84UTM;
	else 
		mParam.nCoordMode = DHE3_COORMODE_XA80;

	m_cmbCoordParameter.GetWindowText(strTemp);
	CSevenParam SevenParam = m_mapSevenParam[strTemp];

	mParam.nLongLatFormat = DHE3_LONGLAT_FORMAT_DU;
	m_editLongitude.GetWindowText(strTemp);
	mParam.dCenterLong = _ttol(strTemp);
	mParam.spSevenParam.dPitch = SevenParam.m_dRX;
	mParam.spSevenParam.dRoll = SevenParam.m_dRZ;
	mParam.spSevenParam.dScale = SevenParam.m_dK;
	mParam.spSevenParam.dXOffset = SevenParam.m_dDX;
	mParam.spSevenParam.dYaw = SevenParam.m_dRY;
	mParam.spSevenParam.dYOffset = SevenParam.m_dDY;
	mParam.spSevenParam.dZOffset = SevenParam.m_dDZ;
	double dLong(0.0l), dLat(0.0l), dH(0.0l);

	//小数点位数
	CString strNum;
	m_cmbDecimalsNum.GetWindowText(strNum);
	int nNum = _ttoi(strNum);

	CString strRow;
	CString strPoint;
	for (int nRow = 0; nRow < m_vecPoleData.size();++nRow)
	{
		OnTransformToBLH(mParam.nCoordMode,true,mParam.dCenterLong,&mParam.spSevenParam,m_vecPoleData[nRow].ptPolePoint.x,m_vecPoleData[nRow].ptPolePoint.y, 0, dLong, dLat, dH);

		strRow.Format(_T("%d"),nRow);
		strPoint.Format(_T("%.*f"),nNum,dLong);
		m_listCoord.SetItemText(nRow, 3, strPoint); 
		strPoint.Format(_T("%.*f"),nNum,dLat);
		m_listCoord.SetItemText(nRow, 4, strPoint);
	} 
}

void CCoordManageDlg::OnLvnEndlabeleditListCoord( NMHDR *pNMHDR, LRESULT *pResult )
{
	NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
	*pResult = 0;

	CString strName = pDispInfo->item.pszText;
	int nSel = pDispInfo->item.iItem;
	m_listCoord.SetFocus();

	if( ( ! strName.IsEmpty() ) && nSel >= 0 )
		m_listCoord.SetItemText( nSel, 0, strName);
}


void CCoordManageDlg::OnBnClickedBtnCoordtrans()
{
	if (m_vecPoleData.size() < 1)
	{
		AfxMessageBox(_T("没有桩塔坐标能够转换,请先拾取线路!"));
		return;
	}

	CString strTemp;
	m_cmbCoordParameter.GetWindowText(strTemp);
	if (strTemp.IsEmpty())
	{
		AfxMessageBox(_T("转换参数为空,请先设置可用的七参数!"));
		return;
	}
	InitListBL();
}

void CCoordManageDlg::OnBnClickedBtnSet()
{
	CParameterManageDlg dlg(m_mapSevenParam,this);
	if (IDOK == dlg.DoModal())
	{
		if (m_mapSevenParam.size() < 1)
			return;

		// 参数转换
		InitSevenParam();
		//保存七参数
		SaveSevenParam();
	}
}

void CCoordManageDlg::LoadCoordParameter()
{
	std::wstring strPath;
	bool bRet = CDwgDataToXml::GetUserConfigFilePath(_T("CoordTransPara.xml"), strPath);
	if (!bRet)
		return;

	//解析配置文件
	CCoordTransArr CoordTransArr;
	CoordTransArr.LoadXMLFile(strPath.c_str());
	for (int nIndex = 0; nIndex < CoordTransArr.size(); ++nIndex)
	{
		CSevenParam SevenParam;
		SevenParam.m_strCur = CoordTransArr[nIndex].m_strCur;
		SevenParam.m_strTar = CoordTransArr[nIndex].m_strTar;
		SevenParam.m_dDX = CoordTransArr[nIndex].m_dDX;
		SevenParam.m_dDY = CoordTransArr[nIndex].m_dDY;
		SevenParam.m_dDZ = CoordTransArr[nIndex].m_dDZ;
		SevenParam.m_dRX = CoordTransArr[nIndex].m_dRX;
		SevenParam.m_dRY = CoordTransArr[nIndex].m_dRY;
		SevenParam.m_dRZ = CoordTransArr[nIndex].m_dRZ;
		SevenParam.m_dK = CoordTransArr[nIndex].m_dK;

		m_mapSevenParam[CoordTransArr[nIndex].m_strName] = SevenParam;
	}
}

void CCoordManageDlg::InitSevenParam()
{
	m_cmbCoordParameter.ResetContent();
	int nIndex = 0;
	std::map<CString,CSevenParam>::iterator it = m_mapSevenParam.begin();
	for(;it != m_mapSevenParam.end(); ++it)
	{
		nIndex = m_cmbCoordParameter.AddString(it->first);
		m_cmbCoordParameter.SetItemData(nIndex,1);
		m_cmbCoordParameter.SetCurSel(0);
	}
}

void CCoordManageDlg::SaveSevenParam()
{
	CCoordTransArr CoordTransArr;
	std::map<CString,CSevenParam>::iterator it = m_mapSevenParam.begin();
	for (; it != m_mapSevenParam.end(); ++it)
	{
		CCoordTrans CoordTrans;
		CoordTrans.m_strName = it->first;
		CoordTrans.m_strCur = it->second.m_strCur;
		CoordTrans.m_strTar = it->second.m_strTar;
		CoordTrans.m_dDX = it->second.m_dDX;
		CoordTrans.m_dDY = it->second.m_dDY;
		CoordTrans.m_dDZ = it->second.m_dDZ;
		CoordTrans.m_dRX = it->second.m_dRX;
		CoordTrans.m_dRY = it->second.m_dRY;
		CoordTrans.m_dRZ = it->second.m_dRZ;
		CoordTrans.m_dK = it->second.m_dK;
		
		CoordTransArr.push_back(CoordTrans);
	}

	std::wstring strPath;
	CDwgDataToXml::GetUserConfigFilePath(_T("CoordTransPara.xml"),strPath);

	CoordTransArr.SaveXMLFile(strPath.c_str());
}


void CCoordManageDlg::OnNMRClickListCoord(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;

	POINT point;
	GetCursorPos(&point);
	ScreenToClient(&point);

	if (point.x == -1 && point.y == -1)           //判断是否在窗口外面
	{
		CRect rect;
		m_listCoord.GetClientRect(rect);  //获得窗口客户区的大小      
		m_listCoord.ClientToScreen(rect); //转化为屏幕坐标
		point = rect.TopLeft();//获取左上角坐标
		//point.Offset(5, 5);    //坐标偏移5,5
	}

	CMenu menu;//声明菜单对象
	menu.LoadMenu(IDR_MENU1);//从应用程序的可执行文件中加载菜单资源
	CMenu* pPopup  = NULL;
	pPopup= menu.GetSubMenu(0);  //得到第一个弹出菜单的指针,也就是菜单中的第一个弹出菜单
	if (NULL == pPopup)
		return;

	// 将坐标值由客户坐标转换为屏幕坐标   
	ClientToScreen(&point); 

	ASSERT(pPopup != NULL); //p断言不为空
	CWnd* pWndPopupOwner = this;//当前类的指针

	//下面就是弹出菜单
	pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndPopupOwner);
}


void CCoordManageDlg::OnMenuClickedAdd()
{
	// 增长
	int nSel=m_listCoord.GetSelectionMark();
	CString strName,strXCoord,strYCoord,strLong,strLat;
	CCoordEditDlg dlg(strName,strXCoord,strYCoord,strLong,strLat); 
	if (dlg.DoModal() != IDOK)         
		return;

	dlg.GetData(strName,strXCoord,strYCoord,strLong,strLat);
	CString strCurID;
	strCurID.Format (_T("%d"),nSel + 1);
	m_listCoord.InsertItem(nSel + 1, strCurID); 
	m_listCoord.SetItemText(nSel + 1, 0, strName); 
	m_listCoord.SetItemText(nSel + 1, 1, strXCoord);
	m_listCoord.SetItemText(nSel + 1, 2, strYCoord);
	m_listCoord.SetItemText(nSel + 1, 3, strLong);
	m_listCoord.SetItemText(nSel + 1, 4, strLat);
}


void CCoordManageDlg::OnMenuClickedModify()
{
	int nSel=m_listCoord.GetSelectionMark();
	CString strName = m_listCoord.GetItemText(nSel,0);
	CString strXCoord = m_listCoord.GetItemText(nSel,1);
	CString strYCoord = m_listCoord.GetItemText(nSel,2);
	CString strLong = m_listCoord.GetItemText(nSel,3);
	CString strLat = m_listCoord.GetItemText(nSel,4);
	CCoordEditDlg  dlg(strName,strXCoord,strYCoord,strLong,strLat); 
	if (dlg.DoModal() != IDOK)         
		return;

	dlg.GetData(strName,strXCoord,strYCoord,strLong,strLat);
	m_listCoord.SetItemText(nSel, 0, strName); 
	m_listCoord.SetItemText(nSel, 1, strXCoord);
	m_listCoord.SetItemText(nSel, 2, strYCoord);
	m_listCoord.SetItemText(nSel, 3, strLong);
	m_listCoord.SetItemText(nSel, 4, strLat);
}

void CCoordManageDlg::OnMenuClickDelete()
{
	int nSel=m_listCoord.GetSelectionMark();
	m_listCoord.DeleteItem(nSel); 
}


void CCoordManageDlg::OnBnClickedBtnCoord()
{
	//获得模板表格
	std::wstring strTempPath;
	if (!(CDwgDataToXml::GetUserConfigFilePath(_T("东北坐标导出模板.xls"), strTempPath)))
	{
		AfxMessageBox(_T("没有 东北坐标导出模板.xls 模板!"));
		return;
	}
	
	//用户选择路径
	CString strPath;
	if (!GetUserSelectDir(strPath))
		return;

	strPath += _T("\\桩位表.xls");
	BOOL bRet = CopyFile(strTempPath.c_str(),strPath,FALSE);

	CExcelReaderLibXl xlsReader;
	if ( !xlsReader.Open(strPath))
		return;

	//把坐标填充到表格
	CString strTempName;
	CString strTempX;
	CString strTempY;
	for (int nRow = 0; nRow < m_listCoord.GetItemCount(); ++nRow)
	{
		strTempName = m_listCoord.GetItemText(nRow,0);
		xlsReader.WirteCellText( 0 ,nRow + 1,0,strTempName);

		strTempX = m_listCoord.GetItemText(nRow,1);
		xlsReader.WirteCellText( 0 ,nRow + 1,1,strTempX);

		strTempY = m_listCoord.GetItemText(nRow,2);
		xlsReader.WirteCellText( 0 ,nRow + 1,2,strTempY);
	}

	xlsReader.Save();
	if (_taccess(strPath, 0) == -1)
		AfxMessageBox(_T("导出失败"));
	else
		AfxMessageBox(_T("导出成功!"));
}


void CCoordManageDlg::OnCbnSelchangeCmbDecimalsnum()
{
	InitListYX(true);
}

拾取线路:3d

DwgDataToXml.h指针

#pragma once
#include <vector>
#include "PrjStruct.h"

struct CPoleData
{
	AcGePoint3d ptPolePoint;//桩位点
	CString strName;//标注名称
};

//把dwg中的点位数据整理成kml文件	
class CDwgDataToXml
{
public:
	CDwgDataToXml(void);
	~CDwgDataToXml(void);

public:
	//外部入口
	static void Inlet(std::vector<CPoleData>& vecPoleData);
	//加载dwg图纸
	static void OnLoadDWG();
	//读取用户配置文件路径 
	static bool GetUserConfigFilePath(LPCTSTR lpFileName, std::wstring& strFilePath);

	//获得桩名对应位置
	std::vector<CPoleData> GetPoleData(AcGePoint3dArray vecXYPoint);
	//获得上一级目录
	void GetParentPath(CString & strPath);
	//设置图层名
	void SetLayerName(CString strLayerName);
private:
	// 由选择集获得实体ID
	BOOL GetIdArrayFromSS(ads_name selectSet,AcDbObjectIdArray &idArray);
	//经过实体id得到坐标点和图层
	bool GetPosAndLayerFromId(const AcDbObjectId &polyId,AcGePoint3dArray &vecPoint,CString &strLayer);
	//获得离点最近的标注
	CString GetNearestLable(const AcGePoint3d ptPoint);
	
	//经过标注id获得标注名称和位置
	bool GetLableDataFromId(AcDbObjectId &Id);
	//经过选择集获得标注信息
	bool GetLabelFromXZJ(CString& strLayer);
	//获得桩位XY坐标点和图层
	bool GetXYPoints(AcGePoint3dArray &vecPoint,CString& strLayer);

	//获得dwg图纸路径
	CString GetDwgPath();
	//打开dwg图纸
	BOOL OpenDwg(CString &strPath);
private:
	std::map<CString,AcGePoint3d> m_mapLable;//标注名称的位置
	CString m_strLayerName;//图层名称
	std::vector<CPoleData> m_vecPoleData;//桩位数据
};

DwgDataToXml.cpprest

#include "StdAfx.h"
#import <MSXML.DLL> named_guids 
#include "DwgDataToXml.h"
#include <afxdlgs.h>
#include "CoordManageDlg.h"
#include <winuser.h>
#include <tchar.h>


CDwgDataToXml::CDwgDataToXml(void)
{
}


CDwgDataToXml::~CDwgDataToXml(void)
{
}

void CDwgDataToXml::Inlet(std::vector<CPoleData>& vecPoleData)
{
	//1.选择实体,获得多段线的点和图层
	CDwgDataToXml dwgDataToxml;
	AcGePoint3dArray vecXYPoint;//桩位XY坐标点
	CString strLayer;//图层名称
	dwgDataToxml.GetXYPoints(vecXYPoint,strLayer);
	if (vecXYPoint.length() <= 0)
	{
		AfxMessageBox(_T("选择实体不正确!,请选择多段线"));
		return;
	}
		
	//2.经过选择集获得标注位置和名称
	dwgDataToxml.GetLabelFromXZJ(strLayer);

	//3.获得杆的位置和坐标
	vecPoleData = dwgDataToxml.GetPoleData(vecXYPoint);
	if (vecPoleData.size() < 1)
		AfxMessageBox(_T("未提取到正确的线路,请从新提取!"));
}

BOOL CDwgDataToXml::GetIdArrayFromSS( ads_name selectSet,AcDbObjectIdArray &idArray )
{
	idArray.setLogicalLength(0);

	long len = 0;
	acedSSLength(selectSet,&len);

	if (acedSSLength(selectSet,&len) != RTNORM)		return FALSE;

	for(long i = 0; i < len; i++)
	{
		ads_name en_SS;
		if (acedSSName(selectSet,i,en_SS) != RTNORM)		return FALSE;

		AcDbObjectId enId_SS;
		if (acdbGetObjectId(enId_SS,en_SS) != Acad::eOk)		return FALSE;

		if (!enId_SS.isNull() && !idArray.contains(enId_SS))
		{
			idArray.append(enId_SS);
		}
	}

	return TRUE;
}

bool CDwgDataToXml::GetPosAndLayerFromId( const AcDbObjectId &polyId,AcGePoint3dArray &vecPoint,CString &strLayer)
{
	//获得实体
	AcDbEntity* pEnt = NULL;
	Acad::ErrorStatus es = acdbOpenObject(pEnt,polyId,AcDb::kForRead);
	if (es != Acad::eOk)
		return false;

	//获得图层
	ACHAR* pTemp = pEnt->layer();
	if (NULL != pTemp)
		strLayer = pTemp;

	if (pEnt->isA() == AcDbPolyline::desc())//多段线
	{
		AcDbPolyline *pPolyline = AcDbPolyline::cast(pEnt);
		for (int i = 0; i < pPolyline->numVerts(); i++)
		{
			AcGePoint3d pt;
			pPolyline->getPointAt(i,pt);
			vecPoint.append(pt);
		}
		pPolyline = NULL;
	}

	return true;
}

void CDwgDataToXml::OnLoadDWG()
{
	//获得dwg图纸路径
	CDwgDataToXml dwgDataToxml;
	CString strPath = dwgDataToxml.GetDwgPath();

	//打开dwg图纸
	if(!dwgDataToxml.OpenDwg(strPath))
		acdbFail(_T("打开dwg图纸失败"));
}

void CDwgDataToXml::GetParentPath( CString & strPath )
{
	int nPos = strPath.ReverseFind(_T('\\'));
	strPath = strPath.Left(nPos);
	//strPath.TrimRight(_T("\\"));
}

CString CDwgDataToXml::GetDwgPath()
{
	TCHAR szFilePath[MAX_PATH+1];
	memset(szFilePath, 0, MAX_PATH+1);
	GetModuleFileName(_hdllInstance, szFilePath, MAX_PATH);

	CString strPath(szFilePath);
	GetParentPath(strPath);
	GetParentPath(strPath);
	GetParentPath(strPath);
	strPath = strPath + _T("\\Dwg\\CAD选线成果样例1.dwg");
	if (_taccess(strPath, 0) != -1)
	{
		//用户选择dwg
		CFileDialog dlg(TRUE, _T("*.dwg"), NULL, OFN_HIDEREADONLY, _T("AutoCAD File(*.dwg)|*.dwg||"),NULL);
		if ( dlg.DoModal() == IDOK )
			strPath = dlg.GetPathName();
	}

	return strPath;
}

BOOL CDwgDataToXml::OpenDwg( CString &strPath )
{
	//判断文件是否存在
	TCHAR fullpath[356]; 
	if (acedFindFile(strPath,fullpath) != RTNORM)
	{
		acdbFail(_T("工程文件没有找到!"));
		return TRUE;
	}
	//打开文件
	if (!acDocManager->isApplicationContext()) 
		return FALSE;

	// 查看文件是否已经打开,打开则不做处理
	AcApDocument *pDocOld;
	CString strFileName;
	AcApDocumentIterator *pIter  = acDocManager->newAcApDocumentIterator();
	Acad::ErrorStatus es = Acad::eOk;
	for(; !pIter->done(); pIter->step())
	{
		pDocOld = pIter->document();
		strFileName = pDocOld->fileName();
		if(strFileName.CompareNoCase(strPath) == 0)
		{
			delete pIter;
			es = acDocManager->setCurDocument(pDocOld,AcAp::kNone,true);

			return TRUE;
		}
	}
	delete pIter;

	// 没有打开
	if (!acDocManager->isApplicationContext()) 
		return FALSE;

	es = acDocManager->appContextOpenDocument((const TCHAR*)fullpath);
	if(es != Acad::eOk && es != Acad::eFilerError)	//注意!!!!若是是系统加载的时候会返回eFilerError
		return FALSE;

	return TRUE;
}

bool CDwgDataToXml::GetXYPoints(AcGePoint3dArray &vecPoint,CString& strLayer )
{
	//选择实体
	acutPrintf(_T("\n请选择实体:\n"));

	struct resbuf eb;  
	TCHAR sbuf[20];  
	eb.restype=0; //实体名  
	_tcscpy_s(sbuf,_T("LWPOLYLINE"));  
	eb.resval.rstring=sbuf;  
	eb.rbnext=NULL; //无其余内容  

	ads_name selectset;
	int rc = acedSSGet(_T(":S"),NULL,NULL,&eb,selectset);// :S表示单选
	if (rc == RTCAN)//用户取消请求
	{
		acedSSFree(selectset);
		return false;
	}
	else if (rc != RTNORM)   
	{
		acutPrintf(_T("\n选择实体不正确:\n"));
		acedSSFree(selectset);
		return false;
	}

	//得到实体ID
	AcDbObjectIdArray arrMemberId;
	BOOL bRet = GetIdArrayFromSS(selectset,arrMemberId);
	acedSSFree(selectset);
	if (!bRet)
		return false;

	//得到实体的坐标点
	if (arrMemberId.length() == 1)
		GetPosAndLayerFromId(arrMemberId[0], vecPoint,strLayer);

	return true;
}

bool CDwgDataToXml::GetLabelFromXZJ(CString& strLayer)
{
	//图层
	struct resbuf* eb = NULL;
	eb = acutBuildList(-4, _T("<or"), 8, strLayer,                        
		-4, _T("or>"),NULL);

	ads_name SelName;
	int rc = acedSSGet(_T("X"), NULL, NULL,eb, SelName);
	acutRelRb(eb);
	if (rc != RTNORM)   
	{
		acedSSFree(SelName);
		return false;
	}

	long len = 0; 
	acedSSLength(SelName,&len);
	for (long i = 0; i < len; i++)
	{
		ads_name entName;
		if (acedSSName(SelName, i, entName) != RTNORM) continue;

		AcDbObjectId eid = AcDbObjectId::kNull;
		acdbGetObjectId(eid, entName);
		if (eid == AcDbObjectId::kNull)
			continue;

		GetLableDataFromId(eid);
	}

	acedSSFree(SelName);
	return true;
}

bool CDwgDataToXml::GetLableDataFromId( AcDbObjectId &Id)
{
	//获得实体
	AcDbEntity* pEnt = NULL;
	Acad::ErrorStatus es = acdbOpenObject(pEnt,Id,AcDb::kForRead);
	if (es != Acad::eOk || NULL == pEnt)
		return false;

	bool bRet = true;
	AcGePoint3d ptPoint;//点位置
	CString strName;//标注
	if (pEnt->isA() == AcDbText::desc())//单文本
	{
		//标注
		AcDbText *pText = AcDbText::cast(pEnt);
		if (NULL == pText)
			bRet = false;
		else
		{
			strName = pText->textString();
			ptPoint = pText->position();
			pText->close();
		}	
	}
	else if (pEnt->isA() == AcDbMText::desc())//多文本
	{
		AcDbMText *pText = AcDbMText::cast(pEnt);
		if (NULL == pText)
			bRet = false;
		else
		{
			strName = pText->text();
			ptPoint = pText->location();
			pText->close();
		}
	}
	else
		bRet = false;

	if (!bRet)
	{
		pEnt->close();
		return true;
	}
	
	m_mapLable[strName] = ptPoint;

	pEnt->close();
	return true;
}

CString CDwgDataToXml::GetNearestLable(const AcGePoint3d ptPoint)
{
	double dCurDistance = 0.0;
	std::map<CString,AcGePoint3d>::iterator it = m_mapLable.begin();
	CString strName = it->first;
	double dMinDistance = (ptPoint - m_mapLable[strName]).length();
	for (; it != m_mapLable.end(); ++it)
	{
		dCurDistance = (ptPoint - m_mapLable[it->first]).length();
		if(dCurDistance < dMinDistance)
		{
			dMinDistance = dCurDistance;
			strName = it->first;	
		}	
	}

	return strName;
}

std::vector<CPoleData> CDwgDataToXml::GetPoleData(AcGePoint3dArray vecXYPoint)
{
	m_vecPoleData.clear();
	if (m_mapLable.size() < 1)
		return m_vecPoleData;

	for (int nIndex = 0; nIndex < vecXYPoint.length(); ++nIndex)
	{
		CPoleData poleData;
		poleData.ptPolePoint = vecXYPoint[nIndex];
		poleData.strName = GetNearestLable(vecXYPoint[nIndex]);
		
		m_vecPoleData.push_back(poleData);
	}
	
	return m_vecPoleData;
}

bool CDwgDataToXml::GetUserConfigFilePath( LPCTSTR lpFileName, std::wstring& strFilePath )
{
	strFilePath.clear();
	// 取得APP Data的路径
	TCHAR szFilePath[MAX_PATH+1];
	memset(szFilePath, 0, MAX_PATH+1);
	GetModuleFileName(_hdllInstance, szFilePath, MAX_PATH);
	CString strPath(szFilePath);
	CDwgDataToXml kml;
	kml.GetParentPath(strPath);
	kml.GetParentPath(strPath);
	kml.GetParentPath(strPath);

	// 在用户路径下查找文件
	std::wstring strUFilePath = strPath + _T("\\Config\\") + lpFileName;
	if (-1 != _taccess(strUFilePath.c_str(), 0))
	{
		strFilePath = strUFilePath;
		return true;
	}

	return !strFilePath.empty();
}

void CDwgDataToXml::SetLayerName( CString strLayerName )
{
	m_strLayerName = strLayerName;
}

设置7参数界面:

ParameterManageDlg.h

#pragma once
#include "resource.h"
#include "CoordManageDlg.h"

// CParameterManageDlg		参数管理	对话框		2017.10.18		
class CParameterManageDlg : public CDialog
{
	DECLARE_DYNAMIC(CParameterManageDlg)

public:
	CParameterManageDlg(std::map<CString,CSevenParam>& mapSevenParam,CWnd* pParent = NULL);   // 标准构造函数
	virtual ~CParameterManageDlg();

// 对话框数据
	enum { IDD = IDD_DLG_PARAMETER_MG };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

	DECLARE_MESSAGE_MAP()
	virtual BOOL OnInitDialog();
	afx_msg void OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult);//单击事件
	afx_msg void OnBnClickedBtnClear();//清除
	afx_msg void OnBnClickedBtnSave();//保存
	afx_msg void OnBnClickedOk();//肯定

private:
	//初始化下拉框
	void InitCombox();
	//初始化表
	void InitList();

	//清除小数点和多余的0
	CString ClearZero(double dValue);

	//校验是否添加列表(返回false,名称重复,返回true,nrow大于-1时修改现有list,不然增长一行)
	bool CheckIsAddList(CString strName,CString strCur,CString strTar,int &nRow );
private:
	CComboBox m_cmbCurCoordSystem;
	CComboBox m_cmbTarCoordSystem;
	CEdit m_editName;
	CEdit m_editDX;
	CEdit m_editDY;
	CEdit m_editDZ;
	CEdit m_editK;
	CEdit m_editRX;
	CEdit m_editRY;
	CEdit m_editRZ;
	CListCtrl m_list;

	std::map<CString,CSevenParam>& m_mapSevenParam;
};

ParameterManageDlg.cpp

// ParameterManageDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "ParameterManageDlg.h"
#include "afxdialogex.h"
#include "PrjStruct.h"


// CParameterManageDlg 对话框

IMPLEMENT_DYNAMIC(CParameterManageDlg, CDialog)

CParameterManageDlg::CParameterManageDlg(std::map<CString,CSevenParam>& mapSevenParam,CWnd* pParent /*=NULL*/)
	: CDialog(CParameterManageDlg::IDD, pParent)
	,m_mapSevenParam(mapSevenParam)
{

}

CParameterManageDlg::~CParameterManageDlg()
{
}

void CParameterManageDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_CMB_CURCOORDSYSTEM, m_cmbCurCoordSystem);
	DDX_Control(pDX, IDC_CMB_TARCOORDSYSTEM, m_cmbTarCoordSystem);
	DDX_Control(pDX, IDC_EDIT_NAME, m_editName);
	DDX_Control(pDX, IDC_EDIT_DX, m_editDX);
	DDX_Control(pDX, IDC_EDIT_DY, m_editDY);
	DDX_Control(pDX, IDC_EDIT_DZ, m_editDZ);
	DDX_Control(pDX, IDC_EDIT_K , m_editK );
	DDX_Control(pDX, IDC_EDIT_RX, m_editRX);
	DDX_Control(pDX, IDC_EDIT_RY, m_editRY);
	DDX_Control(pDX, IDC_EDIT_RZ, m_editRZ);
	DDX_Control(pDX, IDC_LIST, m_list);
}


BEGIN_MESSAGE_MAP(CParameterManageDlg, CDialog)
	ON_BN_CLICKED(IDC_BTN_CLEAR, &CParameterManageDlg::OnBnClickedBtnClear)
	ON_BN_CLICKED(IDC_BTN_SAVE, &CParameterManageDlg::OnBnClickedBtnSave)
	ON_BN_CLICKED(IDOK, &CParameterManageDlg::OnBnClickedOk)
	ON_NOTIFY(NM_CLICK, IDC_LIST, &CParameterManageDlg::OnNMClickList)
END_MESSAGE_MAP()


// CParameterManageDlg 消息处理程序
BOOL CParameterManageDlg::OnInitDialog()
{
	__super::OnInitDialog();

	InitCombox();
	InitList();

	return TRUE;  
}

void CParameterManageDlg::InitCombox()
{
	//当前坐标系
	int nIndex = m_cmbCurCoordSystem.AddString(_T("1954北京坐标系"));
	m_cmbCurCoordSystem.SetItemData(nIndex,1);
	nIndex = m_cmbCurCoordSystem.AddString(_T("1980西安坐标系"));
	m_cmbCurCoordSystem.SetItemData(nIndex,2);
	nIndex = m_cmbCurCoordSystem.AddString(_T("WGS84坐标系"));
	m_cmbCurCoordSystem.SetItemData(nIndex,3);
	m_cmbCurCoordSystem.SetCurSel(0);

	//当前坐标系
	nIndex = m_cmbTarCoordSystem.AddString(_T("1954北京坐标系"));
	m_cmbTarCoordSystem.SetItemData(nIndex,1);
	nIndex = m_cmbTarCoordSystem.AddString(_T("1980西安坐标系"));
	m_cmbTarCoordSystem.SetItemData(nIndex,2);
	nIndex = m_cmbTarCoordSystem.AddString(_T("WGS84坐标系"));
	m_cmbTarCoordSystem.SetItemData(nIndex,3);
	m_cmbTarCoordSystem.SetCurSel(2);
}


void CParameterManageDlg::OnBnClickedBtnClear()
{
	CString strTemp = _T("");
	m_editName.SetWindowText(strTemp);
	m_editDX.SetWindowText(strTemp);
	m_editDY.SetWindowText(strTemp);
	m_editDZ.SetWindowText(strTemp);
	m_editRX.SetWindowText(strTemp);
	m_editRY.SetWindowText(strTemp);
	m_editRZ.SetWindowText(strTemp);
	m_editK.SetWindowText(strTemp);
}

void CParameterManageDlg::OnBnClickedBtnSave()
{
	CString strError;
	CString strName;
	m_editName.GetWindowText(strName);
	if (strName.IsEmpty())
		strError = _T("名称");

	CString strDX;
	m_editDX.GetWindowText(strDX);
	if (strDX.IsEmpty())
	{
		if (!strError.IsEmpty())
			strError += _T(",");
		strError += _T("DX");
	}

	CString strDY;
	m_editDY.GetWindowText(strDY);
	if (strDY.IsEmpty())
	{
		if (!strError.IsEmpty())
			strError += _T(",");
		strError += _T("DY");
	}

	CString strDZ;
	m_editDZ.GetWindowText(strDZ);
	if (strDZ.IsEmpty())
	{
		if (!strError.IsEmpty())
			strError += _T(",");
		strError += _T("DZ");
	}

	CString strRX;
	m_editRX.GetWindowText(strRX);
	if (strRX.IsEmpty())
	{
		if (!strError.IsEmpty())
			strError += _T(",");
		strError += _T("RX");
	}

	CString strRY;
	m_editRY.GetWindowText(strRY);
	if (strRY.IsEmpty())
	{
		if (!strError.IsEmpty())
			strError += _T(",");
		strError += _T("RY");
	}

	CString strRZ;
	m_editRZ.GetWindowText(strRZ);
	if (strRZ.IsEmpty())
	{
		if (!strError.IsEmpty())
			strError += _T(",");
		strError += _T("RZ");
	}

	CString strK;
	m_editK.GetWindowText(strK);
	if (strK.IsEmpty())
	{
		if (!strError.IsEmpty())
			strError += _T(",");
		strError += _T("K");
	}

	if (!strError.IsEmpty())
	{
		CString strTemp;
		strTemp.Format(_T("%s为空,请先填写完整!"),strError);
		AfxMessageBox(strTemp);
		return;
	}

	int nRow = -1;
	CString strCur;
	m_cmbCurCoordSystem.GetWindowText(strCur);
	CString strTar;
	m_cmbTarCoordSystem.GetWindowText(strTar);

	if (!CheckIsAddList(strName,strCur,strTar,nRow))
		return;

	//加入表格
	CString strRow;
	if (-1 == nRow)
	{
		nRow = m_list.GetItemCount();
		strRow.Format(_T("%d"),nRow);
		m_list.InsertItem(nRow, strRow); 
	}
	
	m_list.SetItemText(nRow, 0, strCur); 
	m_list.SetItemText(nRow, 1, strTar);
	m_list.SetItemText(nRow, 2, strDX);
	m_list.SetItemText(nRow, 3, strDY);
	m_list.SetItemText(nRow, 4, strDZ);
	m_list.SetItemText(nRow, 5, strRX);
	m_list.SetItemText(nRow, 6, strRY);
	m_list.SetItemText(nRow, 7, strRZ);
	m_list.SetItemText(nRow, 8, strK);
	m_list.SetItemText(nRow, 9, strName);
}

void CParameterManageDlg::InitList()
{
	CRect rect; 
	m_list.GetClientRect(&rect);
	m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);

	m_list.InsertColumn(0, _T("源坐标系"), LVCFMT_CENTER, rect.Width()/9, 0);
	m_list.InsertColumn(1, _T("目标坐标系" ), LVCFMT_CENTER, rect.Width()/9, 1);   
	m_list.InsertColumn(2, _T("DX"	), LVCFMT_CENTER, rect.Width()/9, 2);
	m_list.InsertColumn(3, _T("DY"   ), LVCFMT_CENTER, rect.Width()/9, 3);   
	m_list.InsertColumn(4, _T("DZ"	), LVCFMT_CENTER, rect.Width()/9, 4);
	m_list.InsertColumn(5, _T("RX"	), LVCFMT_CENTER, rect.Width()/9, 5);
	m_list.InsertColumn(6, _T("RY"   ), LVCFMT_CENTER, rect.Width()/9, 6);   
	m_list.InsertColumn(7, _T("RZ"	), LVCFMT_CENTER, rect.Width()/9, 7);
	m_list.InsertColumn(8, _T("K" ), LVCFMT_CENTER, rect.Width()/9, 8);  
	m_list.InsertColumn(9,_T("名称"),LVCFMT_CENTER,0,9);

	CString strTemp;
	CString strRow;
	std::map<CString,CSevenParam>::iterator it = m_mapSevenParam.begin();
	for (int nRow = 0; it != m_mapSevenParam.end(); ++it,++nRow)
	{
		strRow.Format(_T("%d"),nRow);
		m_list.InsertItem(nRow, strRow); 
		m_list.SetItemText(nRow, 0, it->second.m_strCur); 
		m_list.SetItemText(nRow, 1, it->second.m_strTar);
		m_list.SetItemText(nRow, 2, ClearZero(it->second.m_dDX)); 
		m_list.SetItemText(nRow, 3, ClearZero(it->second.m_dDY)); 
		m_list.SetItemText(nRow, 4, ClearZero(it->second.m_dDZ)); 
		m_list.SetItemText(nRow, 5, ClearZero(it->second.m_dRX)); 
		m_list.SetItemText(nRow, 6, ClearZero(it->second.m_dRY)); 
		m_list.SetItemText(nRow, 7, ClearZero(it->second.m_dRZ)); 
		m_list.SetItemText(nRow, 8, ClearZero(it->second.m_dK)); 
		m_list.SetItemText(nRow, 9, it->first); 
	} 
}

bool CParameterManageDlg::CheckIsAddList(CString strName, CString strCur,CString strTar,int &nRow )
{
	UpdateData(FALSE);
	CString strText;
	for (int row = 0; row < m_list.GetItemCount(); ++row)
	{
		strText = m_list.GetItemText(row,0);
		if (strText == strCur)
		{
			strText = m_list.GetItemText(row,1);
			if (strText == strTar)
			{
				nRow = row;
				break;
			}
		}
	}

	//校验名称
	for (int row = 0; row < m_list.GetItemCount(); ++row)
	{
		if (nRow == row)
			continue;
		
		strText = m_list.GetItemText(row,9);
		if (strText == strName)
		{
			strText.Format(_T("%s名称已经存在,不能保存!"),strName);
			AfxMessageBox(strText);
			return false;
		}
	}

	return true;
}

void CParameterManageDlg::OnBnClickedOk()
{
	m_mapSevenParam.clear();
	CString strText;
	for (int nRow = 0; nRow < m_list.GetItemCount(); ++nRow)
	{
		CSevenParam SevenParam;
		strText = m_list.GetItemText(nRow,9);
		
		SevenParam.m_strCur = m_list.GetItemText(nRow,0);
		SevenParam.m_strTar = m_list.GetItemText(nRow,1);
		CString str = m_list.GetItemText(nRow,2);
		SevenParam.m_dDX = _tstof(m_list.GetItemText(nRow,2));
		SevenParam.m_dDY = _tstof(m_list.GetItemText(nRow,3));	
		SevenParam.m_dDZ = _tstof(m_list.GetItemText(nRow,4));	
		SevenParam.m_dRX = _tstof(m_list.GetItemText(nRow,5));	
		SevenParam.m_dRY = _tstof(m_list.GetItemText(nRow,6));	
		SevenParam.m_dRZ = _tstof(m_list.GetItemText(nRow,7));	
		SevenParam.m_dK  = _tstof(m_list.GetItemText(nRow,8));	

		m_mapSevenParam[strText] = SevenParam;
	}
	
	__super::OnOK();
}


void CParameterManageDlg::OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;

	int nSel=m_list.GetSelectionMark();
	CString strCur = m_list.GetItemText(nSel,0);
	m_cmbCurCoordSystem.SetWindowText(strCur);
	CString strTar = m_list.GetItemText(nSel,1);
	m_cmbTarCoordSystem.SetWindowText(strTar);
	CString strDX = m_list.GetItemText(nSel,2);
	m_editDX.SetWindowText(strDX);
	CString strDY = m_list.GetItemText(nSel,3);
	m_editDY.SetWindowText(strDY);
	CString strDZ = m_list.GetItemText(nSel,4);
	m_editDZ.SetWindowText(strDZ);
	CString strRX = m_list.GetItemText(nSel,5);
	m_editRX.SetWindowText(strRX);
	CString strRY = m_list.GetItemText(nSel,6);
	m_editRY.SetWindowText(strRY);
	CString strRZ = m_list.GetItemText(nSel,7);
	m_editRZ.SetWindowText(strRZ);
	CString strK = m_list.GetItemText(nSel,8);
	m_editK.SetWindowText(strK);
	CString strName = m_list.GetItemText(nSel,9);
	m_editName.SetWindowText(strName);
}

CString CParameterManageDlg::ClearZero( double dValue )
{
	CString strValue ;
	strValue.Format(_T("%.20f"),dValue);
	strValue.TrimRight(_T("0"));
	strValue.TrimRight(_T("."));
	return strValue;
}

7参数是保存到配置文件里的, XMLExt.cpp 用的仍是初版本的, PrjStruct.h 中把xml改成了kml,以及7参数的保存的xml,xml生成的相关代码看博客:https://my.oschina.net/u/2930533/blog/1829743

坐标列表添加了右键菜单

CoordEditDlg.h

#pragma once
#include "Resource.h"
#include "afxwin.h"

// CCoordEditDlg 对话框
class CCoordEditDlg : public CDialog
{
	DECLARE_DYNAMIC(CCoordEditDlg)

public:
	CCoordEditDlg(CString& strName,CString& strXCoord, CString& strYCoord,CString& strLong, CString& strLat,CWnd* pParent = NULL);   // 标准构造函数
	virtual ~CCoordEditDlg();

// 对话框数据
	enum { IDD = IDD_DLG_COORDEDIT };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
	DECLARE_MESSAGE_MAP()
	virtual BOOL OnInitDialog();
	afx_msg void OnBnClickedOk();//肯定
public:
	void GetData(CString& strName,CString& strXCoord, CString& strYCoord,CString& strLong, CString& strLat);
private:
	CEdit m_editName;
	CString m_strName;//名称
	CEdit m_editXCoord;
	CString m_strXCoord;//东坐标
	CEdit m_editYCoord;
	CString m_strYCoord;//北坐标
	CEdit m_editLong;
	CString m_strLong;//经度
	CEdit m_editLat;
	CString m_strLat;//纬度
};

CoordEditDlg.cpp

// CoordEditDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "CoordEditDlg.h"
#include "afxdialogex.h"

// CCoordEditDlg 对话框
IMPLEMENT_DYNAMIC(CCoordEditDlg, CDialog)
	CCoordEditDlg::CCoordEditDlg(CString& strName,CString& strXCoord, CString& strYCoord,CString& strLong, CString& strLat,CWnd* pParent /*=NULL*/)
	: CDialog(CCoordEditDlg::IDD, pParent)
	,m_strName(strName)
	,m_strXCoord(strXCoord)
	,m_strYCoord(strYCoord)
	,m_strLong(strLong)
	,m_strLat(strLat)
{
}

CCoordEditDlg::~CCoordEditDlg()
{
}

void CCoordEditDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDITNAME, m_editName);
	DDX_Control(pDX, IDC_EDITLONG, m_editLong);
	DDX_Control(pDX, IDC_EDITLAT, m_editLat);
	DDX_Control(pDX, IDC_EDIT_XCOORD, m_editXCoord);
	DDX_Control(pDX, IDC_EDIT_YCOORD, m_editYCoord);
}


BEGIN_MESSAGE_MAP(CCoordEditDlg, CDialog)
	ON_BN_CLICKED(IDOK, &CCoordEditDlg::OnBnClickedOk)
END_MESSAGE_MAP()

void CCoordEditDlg::OnBnClickedOk()
{
	m_editName.GetWindowText(m_strName);
	m_editXCoord.GetWindowText(m_strXCoord);
	m_editYCoord.GetWindowText(m_strYCoord);
	m_editLong.GetWindowText(m_strLong);
	m_editLat.GetWindowText(m_strLat);

	if (m_strName.IsEmpty() || m_strLong.IsEmpty() || m_strLat.IsEmpty() || m_strXCoord.IsEmpty() || m_strYCoord.IsEmpty())
	{
		MessageBox(_T("请将信息填写完整!"), _T("提示框"), MB_OK | MB_ICONHAND ); 
		return;
	}

	__super::OnOK();
}

BOOL CCoordEditDlg::OnInitDialog()
{
	__super::OnInitDialog();

	m_editName.ReplaceSel(m_strName);
	m_editXCoord.ReplaceSel(m_strXCoord);
	m_editYCoord.ReplaceSel(m_strYCoord);
	m_editLong.ReplaceSel(m_strLong);
	m_editLat.ReplaceSel(m_strLat);

	return TRUE;
}

void CCoordEditDlg::GetData( CString& strName,CString& strXCoord, CString& strYCoord,CString& strLong, CString& strLat )
{
	strName = m_strName;
	strXCoord = m_strXCoord;
	strYCoord = m_strYCoord;
	strLong = m_strLong;
	strLat = m_strLat;
}

导出Excel其中用到了Excel相关的类,具体请看另一篇博客,的方法2:http://www.javashuo.com/article/p-aoxtndls-n.html

相关文章
相关标签/搜索