From fb91015025b055945101ad58684ca96e7281700e Mon Sep 17 00:00:00 2001
From: cbwu <504-wuchengbo@htsdfp.com>
Date: Fri, 9 Aug 2024 08:32:40 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=89=B9=E9=87=8F=E8=88=AA=E7=BA=BF?=
 =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8D=95=E7=82=B9=E5=81=8F=E7=A7=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 GISControlDlg.rc     | 27 +++++++++-----
 GISDlg.cpp           | 84 ++++++++++++++++++++++++++++++++------------
 GISDlg.h             |  2 +-
 resource.h           |  3 +-
 setmultiroutedlg.cpp | 29 +++++++++++++++
 setmultiroutedlg.h   |  9 +++++
 6 files changed, 121 insertions(+), 33 deletions(-)

diff --git a/GISControlDlg.rc b/GISControlDlg.rc
index a6b5c7c..7c810e9 100644
--- a/GISControlDlg.rc
+++ b/GISControlDlg.rc
@@ -422,21 +422,23 @@ BEGIN
     EDITTEXT        IDC_EDIT_EXTERNALLENGTH,70,46,41,15,ES_AUTOHSCROLL,WS_EX_RIGHT
 END
 
-IDD_DLG_SETMULTIROUTE DIALOGEX 0, 0, 210, 159
+IDD_DLG_SETMULTIROUTE DIALOGEX 0, 0, 210, 171
 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "����������������"
 FONT 8, "MS Shell Dlg", 400, 0, 0x1
 BEGIN
-    DEFPUSHBUTTON   "ȷ��",IDOK,39,125,61,20
-    PUSHBUTTON      "ȡ��",IDCANCEL,118,125,61,20
+    DEFPUSHBUTTON   "ȷ��",IDOK,39,142,61,20
+    PUSHBUTTON      "ȡ��",IDCANCEL,118,142,61,20
     LTEXT           "���߼��(m):",IDC_STATIC,25,41,65,14
     EDITTEXT        IDC_EDIT_LINEINTERVAL,112,37,77,21,ES_CENTER | ES_AUTOHSCROLL
     LTEXT           "ƫ�ƽǶ�(��):",IDC_STATIC,25,14,65,14
     EDITTEXT        IDC_EDIT_AZIMUTH,112,10,77,21,ES_CENTER | ES_AUTOHSCROLL
-    LTEXT           "�߶ȼ��(m):",IDC_STATIC,25,69,65,14
-    EDITTEXT        IDC_EDIT_HEIGHTINTERVAL,112,65,77,21,ES_CENTER | ES_AUTOHSCROLL
-    LTEXT           "��������:",IDC_STATIC,26,96,65,14
-    EDITTEXT        IDC_EDIT_LINENUMBER,112,92,77,21,ES_CENTER | ES_AUTOHSCROLL
+    LTEXT           "�߶ȼ��(m):",IDC_STATIC,25,68,65,14
+    EDITTEXT        IDC_EDIT_HEIGHTINTERVAL,112,64,77,21,ES_CENTER | ES_AUTOHSCROLL
+    LTEXT           "��������:",IDC_STATIC,26,95,65,14
+    EDITTEXT        IDC_EDIT_LINENUMBER,112,91,77,21,ES_CENTER | ES_AUTOHSCROLL
+    LTEXT           "������ƫ��(ˮƽ):",IDC_STATIC,25,120,65,14
+    COMBOBOX        IDC_COMBO_HPT,113,118,76,63,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
 END
 
 
@@ -463,6 +465,13 @@ BEGIN
     0
 END
 
+IDD_DLG_SETMULTIROUTE DLGINIT
+BEGIN
+    IDC_COMBO_HPT, 0x403, 2, 0
+0x0030, 
+    0
+END
+
 
 /////////////////////////////////////////////////////////////////////////////
 //
@@ -582,9 +591,9 @@ BEGIN
     IDD_DLG_SETMULTIROUTE, DIALOG
     BEGIN
         LEFTMARGIN, 3
-        RIGHTMARGIN, 204
+        RIGHTMARGIN, 207
         TOPMARGIN, 3
-        BOTTOMMARGIN, 152
+        BOTTOMMARGIN, 167
     END
 END
 #endif    // APSTUDIO_INVOKED
diff --git a/GISDlg.cpp b/GISDlg.cpp
index bd4ab35..9ecea44 100644
--- a/GISDlg.cpp
+++ b/GISDlg.cpp
@@ -5768,15 +5768,18 @@ void CGISDlg::OnEnddesign()     //
 		double azmuth,heightInterval,lineInterval,numLine;
 		bool bSaveMultiLine = false;
 		CString pathName;
+		int singlePointNumber;
 		if (g_b981AMulti && dlg.m_bCheckMultiLine)
 		{
 			SetMultiRouteDlg multiRouteDlg;
+			multiRouteDlg.SetPointNumber(m_designLinePointNum);
 			if (multiRouteDlg.DoModal() == IDOK )
 			{
 				azmuth = multiRouteDlg.azmuth;
 				heightInterval = multiRouteDlg.heightInterval;
 				lineInterval = multiRouteDlg.lineInterval;
 				numLine = multiRouteDlg.numLine;
+				singlePointNumber = multiRouteDlg.GetHPointNumber();
 				bSaveMultiLine = true;
 			}
 			else
@@ -5850,7 +5853,7 @@ void CGISDlg::OnEnddesign()     //
 		if (g_b981AMulti && bSaveMultiLine)
 		{
 			vector<vector<PtStruct>> resultLines;
-			GetMultiRouteLine(azmuth,lineInterval,numLine,m_pDesignLineStruct,m_designLinePointNum,resultLines);
+			GetMultiRouteLine(azmuth,lineInterval,numLine,m_pDesignLineStruct,m_designLinePointNum,resultLines,singlePointNumber);
 			vector<CString>savePathNameArr;
 			SaveMultiRouteLine(pathName,heightInterval,savePathNameArr,resultLines);
 		}
@@ -8570,13 +8573,14 @@ void CGISDlg::OnShowDesignSurveyLineDlg()
 
 
 /****************************�������һ������************************************/
-void CGISDlg::GetMultiRouteLine(double azimuth,double lineInterval,int lineNumber,PtStruct* lineStruct,int nLinePts,vector<vector<PtStruct>>& resultLines)
+void CGISDlg::GetMultiRouteLine(double azimuth,double lineInterval,int lineNumber,PtStruct* lineStruct,int nLinePts,vector<vector<PtStruct>>& resultLines,int hPtOffset)
 {
 	GeoCompute geoComputer;
 	double tmpLon,tmpLat;
 	vector<PtStruct> line;
 	double dist = 0;
 	double lineAzimuth = 0;
+	//bool bOneOffset = false;
 	for (int j=0;j< lineNumber;++j)
 	{
 		line.clear();
@@ -8586,27 +8590,60 @@ void CGISDlg::GetMultiRouteLine(double azimuth,double lineInterval,int lineNumbe
 		lineAzimuth = azimuth;
 		for (int i=0;i< nLinePts;++i)
 		{
-			PtStruct line0 = lineStruct[i];
-			PtStruct line1 = lineStruct[i+1];
-			geoComputer.computeOffsetGeoPosition(tmpLon,tmpLat,lineAzimuth,dist/1000,tmpLon,tmpLat);
-			PtStruct pt;
-			pt.dX = tmpLon;
-			pt.dY = tmpLat;
-			pt.nH = lineStruct[i].nH;
-			pt.nL = lineStruct[i].nL;
-			pt.nPt = lineStruct[i].nPt;
-			pt.nV = lineStruct[i].nV;
-			pt.ch1 = lineStruct[i].ch1;
-			pt.ch2 = lineStruct[i].ch2;
-			line.push_back(pt);
-
-			//CalculateTwoPtsAzimuth(azimuth,lineStruct[i].dX,lineStruct[i].dY,lineStruct[i+1].dX,lineStruct[i+1].dY,3);
-			if (i+1<nLinePts)
+			//PtStruct line0 = lineStruct[i];
+			//PtStruct line1 = lineStruct[i+1];
+/*
+			if (hPtOffset>0 && i!=(hPtOffset-1)) //��ijһ��ˮƽ����ƫ��
+			{
+				tmpLon = lineStruct[i].dX;
+				tmpLat = lineStruct[i].dY;
+				bOneOffset = true;
+			}
+			else
+			{*/
+			if (hPtOffset == 0)
 			{
-				CalculateTwoPtsDistanceAzimuth(dist,lineAzimuth,lineStruct[i].dX,lineStruct[i].dY,lineStruct[i+1].dX,lineStruct[i+1].dY,3);
+				geoComputer.computeOffsetGeoPosition(tmpLon,tmpLat,lineAzimuth,dist/1000,tmpLon,tmpLat);
+				PtStruct pt;
+				pt.dX = tmpLon;
+				pt.dY = tmpLat;
+				pt.nH = lineStruct[i].nH;
+				pt.nL = lineStruct[i].nL;
+				pt.nPt = lineStruct[i].nPt;
+				pt.nV = lineStruct[i].nV;
+				pt.ch1 = lineStruct[i].ch1;
+				pt.ch2 = lineStruct[i].ch2;
+				line.push_back(pt);
+
+				if (i+1<nLinePts)
+				{
+					CalculateTwoPtsDistanceAzimuth(dist,lineAzimuth,lineStruct[i].dX,lineStruct[i].dY,lineStruct[i+1].dX,lineStruct[i+1].dY,3);
+				}
+			}
+			else//��ijһ��ˮƽ����ƫ��
+			{
+				PtStruct pt;
+				pt.nH = lineStruct[i].nH;
+				pt.nL = lineStruct[i].nL;
+				pt.nPt = lineStruct[i].nPt;
+				pt.nV = lineStruct[i].nV;
+				pt.ch1 = lineStruct[i].ch1;
+				pt.ch2 = lineStruct[i].ch2;
+				if (i!=(hPtOffset-1)) 
+				{
+					pt.dX = lineStruct[i].dX;
+					pt.dY = lineStruct[i].dY;
+				}
+				else
+				{
+					geoComputer.computeOffsetGeoPosition(lineStruct[i].dX,lineStruct[i].dY,lineAzimuth,dist/1000,tmpLon,tmpLat);
+					pt.dX = tmpLon;
+					pt.dY = tmpLat;
+					//int i = 0;
+				}
+				line.push_back(pt);
 			}
 			
-			//dist = geoComputer.VincentyDistance(lineStruct[i].dX,lineStruct[i].dY,lineStruct[i+1].dX,lineStruct[i+1].dY);
 		}
 		resultLines.push_back(line);
 	}
@@ -8652,6 +8689,8 @@ void CGISDlg::ShowMultiRouteSetting()
 	if (g_b981AMulti)
 	{
 		SetMultiRouteDlg multiRouteDlg;
+		DrawLineDataStruct selectLineData = m_ShowedLineDataList[m_lineSelectedID];
+		multiRouteDlg.SetPointNumber(selectLineData.pointNum);
 		if (multiRouteDlg.DoModal() == IDOK )
 		{
 			azmuth = multiRouteDlg.azmuth;
@@ -8659,16 +8698,17 @@ void CGISDlg::ShowMultiRouteSetting()
 			lineInterval = multiRouteDlg.lineInterval;
 			numLine = multiRouteDlg.numLine;
 			bSaveMultiLine = true;
+			int hPtNumber = multiRouteDlg.GetHPointNumber();
 
 			CString selectLinePath = m_lineFullPathName[m_lineSelectedID];
 			if (ExtractFileType(selectLinePath) == ".route") return; // ��װ���ĺ��߲�������������
-			DrawLineDataStruct selectLineData = m_ShowedLineDataList[m_lineSelectedID];
+			
 			CString dirPath = ExtractDirPath(selectLinePath);
 			CString fileName = ExtractFileName(selectLinePath,false);
 			pathName = dirPath + "\\" + fileName;
 			//�������߱���
 			vector<vector<PtStruct>> resultLines;
-			GetMultiRouteLine(azmuth,lineInterval,numLine,selectLineData.pts,selectLineData.pointNum,resultLines);
+			GetMultiRouteLine(azmuth,lineInterval,numLine,selectLineData.pts,selectLineData.pointNum,resultLines,hPtNumber);
 			SaveMultiRouteLine(pathName,heightInterval,pathNameArr,resultLines);
 		}
 		else
diff --git a/GISDlg.h b/GISDlg.h
index 0142b63..f69b554 100644
--- a/GISDlg.h
+++ b/GISDlg.h
@@ -997,7 +997,7 @@ public:
 	//���ܣ���ʾ��溽����ƶԻ���
 	void OnShowDesignSurveyLineDlg();
 	/****************************�������һ������************************************/
-	void GetMultiRouteLine(double azimuth,double lineInterval,int lineNumber,PtStruct* lineStruct,int nLinePts,vector<vector<PtStruct>>& resultLines);
+	void GetMultiRouteLine(double azimuth,double lineInterval,int lineNumber,PtStruct* lineStruct,int nLinePts,vector<vector<PtStruct>>& resultLines,int hPtOffset=0);
 	void SaveMultiRouteLine(CString pathDirName,double heightInterval,vector<CString>& savePathNameArr,const vector<vector<PtStruct>>& resultLines);
 	void ShowMultiRouteSetting();
 
diff --git a/resource.h b/resource.h
index 2f68f82..9bfd65c 100644
--- a/resource.h
+++ b/resource.h
@@ -164,6 +164,7 @@
 #define IDR_TOOLBAR3                    1056
 #define IDC_EDIT_MARKER_LAT             1056
 #define IDC_EDIT_FLYSPEED               1056
+#define IDC_COMBO_HPT                   1056
 #define IDB_BITMAP2                     1057
 #define IDC_EDIT_MARKER_NAME            1057
 #define IDC_TXT_FLYTIME                 1057
@@ -435,7 +436,7 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        1174
 #define _APS_NEXT_COMMAND_VALUE         32945
-#define _APS_NEXT_CONTROL_VALUE         1056
+#define _APS_NEXT_CONTROL_VALUE         1057
 #define _APS_NEXT_SYMED_VALUE           1000
 #endif
 #endif
diff --git a/setmultiroutedlg.cpp b/setmultiroutedlg.cpp
index 7400f58..3d4f327 100644
--- a/setmultiroutedlg.cpp
+++ b/setmultiroutedlg.cpp
@@ -14,6 +14,9 @@ SetMultiRouteDlg::SetMultiRouteDlg(CWnd* pParent /*=NULL*/)
 	: CBCGPDialog(SetMultiRouteDlg::IDD, pParent)
 {
 	EnableVisualManagerStyle(TRUE, TRUE);
+
+	numPoints = 0;
+	selectHPtNumber = 0;
 }
 
 SetMultiRouteDlg::~SetMultiRouteDlg()
@@ -23,11 +26,13 @@ SetMultiRouteDlg::~SetMultiRouteDlg()
 void SetMultiRouteDlg::DoDataExchange(CDataExchange* pDX)
 {
 	CBCGPDialog::DoDataExchange(pDX);
+	DDX_Control(pDX, IDC_COMBO_HPT, m_HPtCombobox);
 }
 
 
 BEGIN_MESSAGE_MAP(SetMultiRouteDlg, CBCGPDialog)
 	ON_BN_CLICKED(IDOK, &SetMultiRouteDlg::OnBnClickedOk)
+	ON_CBN_SELCHANGE(IDC_COMBO_HPT, &SetMultiRouteDlg::OnCbnSelchangeComboHpt)
 END_MESSAGE_MAP()
 
 BOOL SetMultiRouteDlg::OnInitDialog()
@@ -39,6 +44,14 @@ BOOL SetMultiRouteDlg::OnInitDialog()
 	GetDlgItem( IDC_EDIT_HEIGHTINTERVAL )->SetWindowTextA("10");
 	GetDlgItem( IDC_EDIT_LINENUMBER )->SetWindowTextA("3");
 
+	CString str;
+	for (int i=1;i<=numPoints;++i)
+	{
+		str.Format("%d",i);
+		m_HPtCombobox.InsertString(i,str);
+	}
+	m_HPtCombobox.SetCurSel(0);
+
 	return TRUE;
 }
 
@@ -75,3 +88,19 @@ void SetMultiRouteDlg::OnBnClickedOk()
 
 	this->OnOK();
 }
+
+void SetMultiRouteDlg::SetPointNumber(int num)
+{
+	numPoints = num;	
+}
+
+int SetMultiRouteDlg::GetHPointNumber()
+{
+	return selectHPtNumber;
+}
+
+
+void SetMultiRouteDlg::OnCbnSelchangeComboHpt()
+{
+	selectHPtNumber = m_HPtCombobox.GetCurSel();
+}
diff --git a/setmultiroutedlg.h b/setmultiroutedlg.h
index eef9e4b..dd51328 100644
--- a/setmultiroutedlg.h
+++ b/setmultiroutedlg.h
@@ -1,5 +1,6 @@
 #pragma once
 #include "Resource.h"
+#include "afxwin.h"
 
 // SetMultiRouteDlg �Ի���
 
@@ -24,4 +25,12 @@ protected:
 	DECLARE_MESSAGE_MAP()
 public:
 	afx_msg void OnBnClickedOk();
+	void SetPointNumber(int num);
+	int GetHPointNumber();
+private:
+	CBCGPComboBox m_HPtCombobox;
+	int numPoints;
+	int selectHPtNumber;
+public:
+	afx_msg void OnCbnSelchangeComboHpt();
 };