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-.../FlyLineDesign.cpp

590 lines
12 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.

// CFlyLineDesign.cpp: 实现文件
//
#include "stdafx.h"
#include "FlyLineDesign.h"
#include "SetSaveLineID.h"
#include "Globe.h"
#include "LineDesign.h"
// CFlyLineDesign 对话框
CFlyLineDesign::CFlyLineDesign(CWnd* pParent /*=NULL*/)
: CDialog(CFlyLineDesign::IDD, pParent)
{
InitiazeAllMembers();
//总的航点个数
m_totalPtNums = 255;
//航线数据集合
m_pLinePts = new PtStruct[m_totalPtNums];
memset(m_pLinePts, 0, sizeof(PtStruct)*m_totalPtNums);
//航点模式为“置点”
g_ptModeInLineDesign = 0;
}
CFlyLineDesign::~CFlyLineDesign()
{
if (m_pLinePts != NULL)
{
delete []m_pLinePts;
m_pLinePts = NULL;
}
}
void CFlyLineDesign::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_ALT, m_ptAlt);
DDV_MinMaxDouble(pDX, m_ptAlt, 0, 5000);
DDX_Text(pDX, IDC_EDIT_LAT, m_ptLat);
DDV_MinMaxDouble(pDX, m_ptLat, -90.0, 90.0);
DDX_Text(pDX, IDC_EDIT_LON, m_ptLon);
DDV_MinMaxDouble(pDX, m_ptLon, -180.0, 180.0);
DDX_Text(pDX, IDC_EDIT_STAY_TIME, m_flySpeed);
DDX_Control(pDX, IDC_COMBO_PT, m_comboPt);
}
BEGIN_MESSAGE_MAP(CFlyLineDesign, CDialog)
ON_BN_CLICKED(IDC_BTN_ADD_POINT, OnAddFlyLinePoint)
ON_BN_CLICKED(IDC_BTN_EDIT_POINT, OnEditFlyLinePoint)
ON_BN_CLICKED(IDC_BTN_DELETE_POINT, OnDeleteFlyLinePoint)
ON_BN_CLICKED(IDC_BTN_SAVE_LINE, OnSaveFlyLine)
ON_CBN_SELCHANGE(IDC_COMBO_PT, OnCbnSelchangeComboPt)
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
END_MESSAGE_MAP()
//初始化所有的变量
void CFlyLineDesign::InitiazeAllMembers()
{
m_ptAlt = 0.0;
m_ptLat = 0.0;
m_ptLon = 0.0;
//清空航线数据集合
m_linePtNums = 0;
//清空当前的航点数据
memset(&m_curPoint, 0, sizeof(PtStruct));
m_linePtNums = 0;
//是否增加新的航点
m_bAddNewPoint = true;
}
//清除已有的航线数据,包括界面显示的数据
void CFlyLineDesign::ClearCurrentData()
{
//清空所有的变量
InitiazeAllMembers();
//清空组合框的数据集合
if (m_comboPt.GetCount() > 0)
{
m_comboPt.ResetContent();
}
GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_SAVE_LINE)->EnableWindow(FALSE);
//刷新显示
UpdateData(FALSE);
}
//功能:增加新的航点
//输入经度lon,纬度lat
void CFlyLineDesign::AddPoint(const double lon, const double lat)
{
m_curPoint.dX = lon;
m_curPoint.dY = lat;
//设置当前界面的数据
SetWindowMembersValue(m_curPoint);
UpdateData(FALSE);
}
//功能:增加新的航点
//输入航点数据体ptStruct
void CFlyLineDesign::AddPoint(const PtStruct ptStruct)
{
//“置点”按钮可选
GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(TRUE);
//航点编号
m_curPoint.nPt = ptStruct.nPt;
//经度
m_curPoint.dX = ptStruct.dX;
//纬度
m_curPoint.dY = ptStruct.dY;
//插入航点编号
InsertComboBox(ptStruct.nPt);
//设置下拉列表框的焦点
m_comboPt.SetCurSel(ptStruct.nPt-1);
//设置当前界面的数据
SetWindowMembersValue(ptStruct);
UpdateData(FALSE);
}
//功能:对话框界面操作——增加新的航点
void CFlyLineDesign::OnAddFlyLinePoint()
{
//获得软件界面输入的数据
GetWindowMembersValue(m_curPoint);
//加入航线集合中
m_pLinePts[m_linePtNums] = m_curPoint;
m_linePtNums ++;
m_bAddNewPoint = true;
if (m_linePtNums > 0)
{
GetDlgItem(IDC_BTN_SAVE_LINE)->EnableWindow(TRUE);
}
//发送消息到主程序,进行标绘
if (g_mapHwnd != NULL)
{
::SendMessage(g_mapHwnd, WM_ADD_LINE_POINT, 0, 0);
}
//“置点”按钮可选
GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(FALSE);
}
//功能:对话框界面操作——修改航点
void CFlyLineDesign::OnEditFlyLinePoint()
{
//初始化
memset(&m_curPoint, 0, sizeof(PtStruct));
//获得软件界面输入的数据
GetWindowMembersValue(m_curPoint);
//编辑位置
int editPos = m_comboPt.GetCurSel();
//航点编号
m_curPoint.nPt = editPos +1;
//更新航点数据
m_pLinePts[editPos] = m_curPoint;
GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(FALSE);
g_ptModeInLineDesign = 0;
//向主程序发送航点删除信息
if (g_mapHwnd != NULL)
{
::SendMessage(g_mapHwnd, WM_EDIT_LINE_POINT, (WPARAM)(&m_curPoint), 0);
}
}
//功能:对话框界面操作——删除航点
void CFlyLineDesign::OnDeleteFlyLinePoint()
{
UpdateData(TRUE);
//删除航点的航点号
int pointID = m_comboPt.GetCurSel();
//向主程序发送航点删除信息
if (g_mapHwnd != NULL)
{
::SendMessage(g_mapHwnd, WM_DELETE_LINE_POINT, (WPARAM)pointID, 0);
}
//删除选定点,改点后面的点依次往前移动一位
for (int i=pointID; i<m_linePtNums-1; i++)
{
m_pLinePts[i] = m_pLinePts[i+1];
m_pLinePts[i].nPt --;
}
//航点个数减少1
m_linePtNums --;
//清除组合框现有数据
if (m_comboPt.GetCount()>0)
{
m_comboPt.ResetContent();
for (int i=0; i<m_linePtNums; i++)
{
InsertComboBox(i+1);
}
}
//航点个数大于0
if (m_linePtNums > 0)
{
m_curPoint = m_pLinePts[m_linePtNums-1];
//设置下拉列表框显示最后一个元素
m_comboPt.SetCurSel(m_linePtNums-1);
}
else
{
memset(&m_curPoint, 0, sizeof(PtStruct));
}
//设置软件界面显示的数据
SetWindowMembersValue(m_curPoint);
UpdateData(FALSE);
GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(FALSE);
g_ptModeInLineDesign = 0;
}
//功能:对话框界面操作——保存航线
void CFlyLineDesign::OnSaveFlyLine()
{
int Char_tmp;
Char_tmp = ((CComboBox*)GetDlgItem(IDC_COMBO_CHAR))->GetCurSel();
switch (Char_tmp)
{
case 0:
m_ptCarctr = 1;
break;
case 1:
m_ptCarctr = 3;
break;
case 2:
m_ptCarctr = 5;
break;
case 3:
m_ptCarctr = 7;
break;
case 4:
m_ptCarctr = 11;
break;
}
g_ptModeInLineDesign = 0;
//如果航线数据为空,返回
if (m_linePtNums <= 0)
{
CDialog::OnOK();
}
//航线文件路径
CString strFlyLineName = _T("");
//航线编号
int designLineID = 0;
//航路特征字
int lineProperty = 0;
//弹出航线选择对话框
CSetSaveLineID dlg;
if (dlg.DoModal() == IDOK)
{
//航路文件名
strFlyLineName = dlg.m_strFlyLineName;
//航线编号
designLineID = dlg.m_designLineID;
//航路特征字
lineProperty = dlg.m_lineProperty;
}
else
{
return ;
}
//选择航点特征字
m_ptCarctr=((CComboBox*)GetDlgItem(IDC_COMBO_CHAR))->GetCurSel() ;
//写出航线数据
FILE *fp = fopen(strFlyLineName, "w" );
if ( fp == NULL )
{
CDialog::OnOK();
}
else
{
PtStruct pt;
memset(&pt, 0, sizeof(PtStruct));
//原点数据写入
fprintf(fp, "%d, %d, %lf, %lf, %.2lf, %d, %02X, %02X\n", designLineID, 0, g_gcsLon, g_gcsLat, 0.0, 0, 0, 2);
//遍历航点集合数据
for ( int i = 0; i < m_linePtNums; i++ )
{
pt = m_pLinePts[i];
//将除最后一个点的数据写入文件
if ( i < (m_linePtNums-1))
{
fprintf(fp, "%d, %d, %lf, %lf, %.2lf, %d, %02X, %02X\n", designLineID, pt.nPt, pt.dX, pt.dY, pt.nH, pt.nV, pt.ch1, pt.ch2);
}
else//将最后一个点的航段特征数据写入文件
{
fprintf(fp, "%d, %d, %lf, %lf, %.2lf, %d, %02X, %02X\n", designLineID, pt.nPt, pt.dX, pt.dY, pt.nH, pt.nV, pt.ch1, lineProperty);
}
}
fclose( fp );
//弹出保存成功对话框
AfxMessageBox(_T("航线文件保存成功!"));
//发送对话框关闭消息到主程序
if (g_mapHwnd != NULL)
{
::SendMessage(g_mapHwnd, WM_CLOSE_LINEDESIGN_DIALOG, 0, 0);
//关闭对话框
CDialog::OnCancel();
}
}
}
//界面数据赋值
//输入航点数据体pt
void CFlyLineDesign::SetWindowMembersValue(const PtStruct pt)
{
//经度
m_ptLon = pt.dX;
//纬度
m_ptLat = pt.dY;
//高度
m_ptAlt = pt.nH;
//飞行速度
m_flySpeed = pt.nV;
}
//功能:获得界面输入的数据
//输入航点数据体pt
//输出航点数据体pt
void CFlyLineDesign::GetWindowMembersValue(PtStruct &pt)
{
UpdateData(TRUE);
//经度
pt.dX = m_ptLon;
//纬度
pt.dY = m_ptLat;
//高度
pt.nH = m_ptAlt;
//飞行速度
pt.nV = m_flySpeed;
//航路特征字
pt.ch2 = 0X02;
}
BOOL CFlyLineDesign::OnInitDialog()
{
CDialog::OnInitDialog();
// SetWindowPos( &CWnd::wndTop, m_rcLineDesignArea.left, m_rcLineDesignArea.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
( ( CComboBox * ) GetDlgItem( IDC_COMBO_CHAR ) )->InsertString(0, _T("复飞航线") );
( ( CComboBox * ) GetDlgItem( IDC_COMBO_CHAR ) )->InsertString(1, _T("还有航点") );
( ( CComboBox * ) GetDlgItem( IDC_COMBO_CHAR ) )->InsertString(2, _T("归航回收") );
( ( CComboBox * ) GetDlgItem( IDC_COMBO_CHAR ) )->InsertString(3, _T("着陆轨迹切入点") );
( ( CComboBox * ) GetDlgItem( IDC_COMBO_CHAR ) )->InsertString(4, _T("接地点") );
( ( CComboBox * ) GetDlgItem( IDC_COMBO_CHAR ) )->SetCurSel(0);
GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_SAVE_LINE)->EnableWindow(FALSE);
// MoveWindow(m_rcLineDesignArea.left, m_rcLineDesignArea.top, 0, 0, TRUE);
//移动到固定的显示区域
// SetWindowPos( &CWnd::wndTop, m_rcLineDesignArea.left, m_rcLineDesignArea.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_HIDEWINDOW );
SetWindowPos( &CWnd::wndTop, m_rcLineDesignArea.left, m_rcLineDesignArea.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_HIDEWINDOW );
// ShowWindow(SW_HIDE);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
//功能:移动对话框到给定的显示区域
void CFlyLineDesign::MoveToGivenArea(const CRect rcArea)
{
m_rcLineDesignArea = rcArea;
m_rcLineDesignArea.top += 20;
}
//功能:下拉列表框航点编号更改
void CFlyLineDesign::OnCbnSelchangeComboPt()
{
UpdateData(TRUE);
//没有航点数据时,返回
if (m_linePtNums <= 0)
{
GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(FALSE);
g_ptModeInLineDesign = 0;
return;
}
//下拉列表框的航点编号不存在于航线集合中时,返回
if (m_comboPt.GetCurSel()+1 > m_linePtNums)
{
GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(FALSE);
g_ptModeInLineDesign = 0;
return;
}
else
{
//选中的航点编号
int selectID = m_comboPt.GetCurSel();
//航点数据
m_curPoint = m_pLinePts[m_comboPt.GetCurSel()];
//设置软件界面显示的数据
SetWindowMembersValue(m_curPoint);
UpdateData(FALSE);
GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(TRUE);
//向主程序发送待编辑的航点数据
if (g_mapHwnd != NULL)
{
::SendMessage(g_mapHwnd, WM_EDIT_LINE_POINT, (WPARAM)(&m_curPoint), 1);
}
g_ptModeInLineDesign = 1;
}
}
void CFlyLineDesign::OnBnClickedCancel()
{
//发送对话框关闭消息到主程序
if (g_mapHwnd != NULL)
{
::SendMessage(g_mapHwnd, WM_CLOSE_LINEDESIGN_DIALOG, 0, 0);
}
g_ptModeInLineDesign = 0;
CDialog::OnCancel();
}
//功能:往下拉列表框增加一行数据
//输入点号pointID
void CFlyLineDesign::InsertComboBox(const int pointID)
{
//判断下该项目是否存在,存在,不新建
if (m_comboPt.GetCount() >= pointID)
{
return;
}
CString str = _T("");
str.Format(_T("%d"), pointID);
//插入组合框中
m_comboPt.InsertString(pointID-1, str);
}
//功能:编辑航点数据
//输入经度lon,纬度lat
void CFlyLineDesign::EditPoint(const double lon, const double lat)
{
//航点数据
m_curPoint.dX = lon;
m_curPoint.dY = lat;
//更新航点数据
m_pLinePts[m_curPoint.nPt-1] = m_curPoint;
//设置软件界面显示的数据
SetWindowMembersValue(m_curPoint);
UpdateData(FALSE);
GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(FALSE);
//向主程序发送航点编辑信息
if (g_mapHwnd != NULL)
{
::SendMessage(g_mapHwnd, WM_EDIT_LINE_POINT, (WPARAM)(&m_curPoint), 1);
}
}