// 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, %.7f, %.7f, %.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, %.7f, %.7f, %.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, %.7f, %.7f, %.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);
	}
}