feat: 新增限制区设计、导入与显示。 #22

Merged
WuChengbo merged 1 commits from dev/cbwu into master 1 year ago

@ -366,6 +366,21 @@ BEGIN
PUSHBUTTON "셨崎긍서",IDC_BTN_CONTINUEEDIT,69,10,50,14
END
IDD_DIALOG_ZONESETTING DIALOGEX 0, 0, 152, 106
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "区域设置"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
PUSHBUTTON "取消",IDCANCEL,78,81,50,14
LTEXT "区域类型:",IDC_STATIC,15,14,65,13
COMBOBOX IDC_COMBO_ZONETYPE,62,12,75,63,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "限飞高度:",IDC_STATIC,15,56,63,13
EDITTEXT IDC_EDIT_HEIGHT,62,51,75,20,ES_CENTER | ES_AUTOHSCROLL
DEFPUSHBUTTON "保存",IDOK,24,81,50,14
LTEXT "区域编号:",IDC_STATIC,15,32,66,13
COMBOBOX IDC_COMBO_ZONEID,62,31,75,63,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
END
/////////////////////////////////////////////////////////////////////////////
//
@ -481,6 +496,14 @@ BEGIN
TOPMARGIN, 3
BOTTOMMARGIN, 29
END
IDD_DIALOG_ZONESETTING, DIALOG
BEGIN
LEFTMARGIN, 3
RIGHTMARGIN, 148
TOPMARGIN, 3
BOTTOMMARGIN, 101
END
END
#endif // APSTUDIO_INVOKED
@ -575,6 +598,26 @@ BEGIN
MENUITEM "錦맣봄듐", ID_EDIT_LINE
MENUITEM "괏닸긍서", ID_EDIT_SAVE
END
POPUP "限制区"
BEGIN
MENUITEM "限制区设计", IDM_DESIGN_ZONE
MENUITEM SEPARATOR
MENUITEM "限制区导入", IDM_IMPORT_ZONE
MENUITEM SEPARATOR
MENUITEM "限制区装订", IDM_BIND_ZONE
MENUITEM SEPARATOR
MENUITEM "显示限飞区1", IDM_SHOW_RESTRICTEDZONE1
MENUITEM "显示限飞区2", IDM_SHOW_RESTRICTEDZONE2
MENUITEM "显示限飞区3", IDM_SHOW_RESTRICTEDZONE3
MENUITEM "显示限飞区4", IDM_SHOW_RESTRICTEDZONE4
MENUITEM "显示限飞区5", IDM_SHOW_RESTRICTEDZONE5
MENUITEM SEPARATOR
MENUITEM "显示禁飞区1", IDM_SHOW_NOFLYZONE1
MENUITEM "显示禁飞区2", IDM_SHOW_NOFLYZONE2
MENUITEM "显示禁飞区3", IDM_SHOW_NOFLYZONE3
MENUITEM "显示禁飞区4", IDM_SHOW_NOFLYZONE4
MENUITEM "显示禁飞区5", IDM_SHOW_NOFLYZONE5
END
END
END

@ -281,6 +281,7 @@
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="SaveLineEditSetting.cpp" />
<ClCompile Include="SaveZoneDlg.cpp" />
<ClCompile Include="ScreenCapture.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
@ -404,6 +405,7 @@
<ClInclude Include="QB_ImgProcessFun.h" />
<ClInclude Include="Resource.h" />
<ClInclude Include="SaveLineEditSetting.h" />
<ClInclude Include="SaveZoneDlg.h" />
<ClInclude Include="ScreenCapture.h" />
<ClInclude Include="SetSaveLineID.h" />
<ClInclude Include="shape.h" />

@ -180,6 +180,9 @@
<ClCompile Include="SaveLineEditSetting.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SaveZoneDlg.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="GISControlDlg.def">
@ -421,5 +424,8 @@
<ClInclude Include="ExportQBGISCtrlClass.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="SaveZoneDlg.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

@ -20,6 +20,8 @@
#include "vectortoraster.h"
#include "SaveLineEditSetting.h"
#include "ModifyLinePointDlg.h"
#include <OleAuto.h>
#include <Windows.h>
#ifdef _DEBUG
#define new DEBUG_NEW
@ -182,6 +184,14 @@ CGISDlg::CGISDlg(CWnd* pParent /*=NULL*/)
memset(m_pDesignLineStruct, 0, sizeof(PtStruct)*m_lineMaxPointNum); //初始化
m_designLinePointNum = 0; //当前航点个数
/*******************************新增限制区********************************/
//绘制禁飞区、限飞区
std::fill(noFlyZoneLayersID, noFlyZoneLayersID + 5, -1);//禁飞区
std::fill(restrictedZoneLayersID, restrictedZoneLayersID + 5, -1);//限飞区
bDrawRestrictedZone = false;
bShowZone = false;
m_tempZoneLayerID = -1;
/**********************************************************************************/
//航线标绘图层ID初始化
m_designLineLayerID = -1;
m_designLineLayerID2 = -1;
@ -581,6 +591,24 @@ BEGIN_MESSAGE_MAP(CGISDlg, CBCGPDialog)
//空投航线
ON_COMMAND(IDM_SHOW_LINE14, &CGISDlg::OnShowLine14)
ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE14, &CGISDlg::OnUpdateShowLine14)
/****************************限制区************************************/
ON_COMMAND(IDM_DESIGN_ZONE,OnDesignZone)
ON_COMMAND(IDM_IMPORT_ZONE,OnImportZone)
ON_COMMAND(IDM_SHOW_RESTRICTEDZONE1,OnShowRestrictedZone1)
ON_COMMAND(IDM_SHOW_RESTRICTEDZONE2,OnShowRestrictedZone2)
ON_COMMAND(IDM_SHOW_RESTRICTEDZONE3,OnShowRestrictedZone3)
ON_COMMAND(IDM_SHOW_RESTRICTEDZONE4,OnShowRestrictedZone4)
ON_COMMAND(IDM_SHOW_RESTRICTEDZONE5,OnShowRestrictedZone5)
ON_COMMAND(IDM_SHOW_NOFLYZONE1,OnShowNoFlyZone1)
ON_COMMAND(IDM_SHOW_NOFLYZONE2,OnShowNoFlyZone2)
ON_COMMAND(IDM_SHOW_NOFLYZONE3,OnShowNoFlyZone3)
ON_COMMAND(IDM_SHOW_NOFLYZONE4,OnShowNoFlyZone4)
ON_COMMAND(IDM_SHOW_NOFLYZONE5,OnShowNoFlyZone5)
ON_COMMAND(IDM_BIND_ZONE,OnBindZone)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
@ -661,6 +689,7 @@ BOOL CGISDlg::OnInitDialog()
m_DlgDemAlt.Create(IDD_DIALOG_DEMALT,this);
//多媒体定时器
timeBeginPeriod(0);
TimerID_Draw = timeSetEvent(500, 1, (LPTIMECALLBACK)CatchMTimerDraw, (DWORD)NULL, TIME_PERIODIC);
@ -1286,28 +1315,14 @@ void CGISDlg::OnShowRMenu()
//显示快捷菜单
CMenu menu;
//CMenu* pMenu = GetMenu();
//if (pMenu != NULL)
//{
/*
CMenu* pSubMenu = menu.GetSubMenu(0);
if (pSubMenu != NULL)
{
CMenu* pSubMenu2 = pSubMenu->GetSubMenu(0);
if (pSubMenu2 != NULL)
{
pSubMenu2->DeleteMenu(IDM_SHOW_LINE14, MF_BYCOMMAND);
}
}*/
//}
POINT pt;
GetCursorPos( &pt );
//当处于回放模式时,设置、导引操作、航线装订子菜单都先灰色
menu.LoadMenu(IDR_MENU2);
//设置限制区勾选状态
SetMenuZoneCheck(menu);
//航线1
if (m_pHaveDrawLineFlag[0])
@ -1895,6 +1910,36 @@ void CGISDlg::MouseDownMap1(short Button, short Shift, long x, long y)
//设置点的经度、纬度
m_pHZDistanceDlg->SetPtCoordinate(dX, dY);
}
/************************************限飞区*************************************/
if(bDrawRestrictedZone && (Button == 1))
{
//像素坐标转换地理坐标
m_map.PixelToProj(x,y, &dX, &dY);
if (!bShowZone)
{
firstZonePoint[0] = dX;
firstZonePoint[1] = dY;
bShowZone = true;
return;
}
if(bShowZone)
{
double xPoints[5];
double yPoints[5];
double endPoint[2] = {dX,dY};
ComputeRectanglePoints(firstZonePoint,endPoint,xPoints,yPoints);
DrawRestrictedZone(m_tempZoneLayerID,xPoints,yPoints,5,0);
m_map.Redraw();
bShowZone = false;
bDrawRestrictedZone = false;
ShowSaveZoneDlg(xPoints,yPoints);
}
return;
}
/***************************************多点测距 by Wu 2023.10.16*****************************************/
if (m_bPolylineMeasure && (Button == 1))
@ -2629,6 +2674,21 @@ void CGISDlg::MouseMoveMap1(short Button, short Shift, long x, long y)
m_pLonLatDlg->SetLonLatInfo(dX, dY);
}
//实时绘制限飞区
if (bShowZone)
{
double dX = 0;
double dY = 0;
m_map.PixelToProj(x,y, &dX, &dY);
double xPoints[5];
double yPoints[5];
double endPoint[2] = {dX,dY};
ComputeRectanglePoints(firstZonePoint,endPoint,xPoints,yPoints);
DrawRestrictedZone(noFlyZoneLayersID[0],xPoints,yPoints,5,1);
m_map.Redraw();
}
/*****************************************by Wu 2023.09.14*******************************************/
//编辑航线时
@ -4871,6 +4931,33 @@ void CGISDlg::OnShowGivenLine(const CString strLineFileName)
BCGPMessageBox("航线号不正确!");
return;
}
int ch = lineDataGroup.linePts[lineDataGroup.pointNum-1].ch1;
if (ch==0x0C) //限飞区
{
//ClearZoneLayer(restrictedZoneLayersID[lineDataGroup.lineID-1]);
double xPoints[5];
double yPoints[5];
for (int i = 0;i<5;++i)
{
xPoints[i] = lineDataGroup.linePts[i].dX;
yPoints[i] = lineDataGroup.linePts[i].dY;
}
DrawRestrictedZone(restrictedZoneLayersID[lineDataGroup.lineID-1],xPoints,yPoints,5,0);
return;
}
else if(ch == 0x0D) //禁飞区
{
double xPoints[5];
double yPoints[5];
for (int i = 0;i<5;++i)
{
xPoints[i] = lineDataGroup.linePts[i].dX;
yPoints[i] = lineDataGroup.linePts[i].dY;
}
DrawRestrictedZone(noFlyZoneLayersID[lineDataGroup.lineID-1],xPoints,yPoints,5,1);
return;
}
/*******************by Wu 2023.09.14****************************/
m_ShowedLineDataList[lineDataGroup.lineID] = lineDataGroup;
@ -7583,6 +7670,383 @@ void CGISDlg::EndPolylineMessure()
return;
}
//显示保存限飞区对话框
void CGISDlg::ShowSaveZoneDlg(double* xPoints,double* yPoints)
{
CSaveZoneDlg saveZoneDlg;
if (IDOK == saveZoneDlg.DoModal())
{
int zoneType = saveZoneDlg.GetZoneType();
int zoneID = saveZoneDlg.GetZoneID();
double height = 0.0;
CString str;
CString dirName = "";
if (zoneType == 0)//限飞区
{
//CreateDirectory("限飞区");
dirName = _T("限飞区\\");
height = saveZoneDlg.GetHeight();
}
else if(zoneType == 1)
{
//CreateDirectory("禁飞区");
dirName = _T("禁飞区\\");
}
//重新保存回收航线
CString filename;
CString strRouteFileDir = GetSoftwareCurrentDirectory() + _T("\\Route\\") + dirName ;
CreateDirectory(strRouteFileDir);
TCHAR s[10000];
s[0]=0;
CFileDialog dlg(FALSE, _T(".txt"), _T("*.txt"));
dlg.m_ofn.lpstrTitle=_T("保存文件");
dlg.m_ofn.lpstrFile=s;
dlg.m_ofn.nMaxFile=sizeof(s)/sizeof(TCHAR);
TCHAR filter[500]=_T("航线文件(*.txt)\0*.txt\0");
dlg.m_ofn.lpstrFilter=filter;
dlg.m_ofn.Flags|=OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_CREATEPROMPT;
dlg.m_ofn.lpstrInitialDir = strRouteFileDir;
if (IDOK == dlg.DoModal())
{
filename = dlg.GetPathName();
//保存文件
FILE* fp = fopen(filename,"w");
fprintf(fp,"%d, 0, %lf, %lf, %.2lf, 0, 00, 03\n", zoneID, 0.0, 0.0, 0.0);
fprintf(fp,"%d, 1, %lf, %lf, %.2lf, 0, 00, 03\n", zoneID, xPoints[0], yPoints[0], height);
fprintf(fp,"%d, 2, %lf, %lf, %.2lf, 0, 00, 03\n", zoneID, xPoints[1], yPoints[1], height);
fprintf(fp,"%d, 3, %lf, %lf, %.2lf, 0, 00, 03\n", zoneID, xPoints[2], yPoints[2], height);
if (zoneType==0)
{
fprintf(fp,"%d, 4, %lf, %lf, %.2lf, 0, 0C, 01\n", zoneID, xPoints[3], yPoints[3], height);
}
else if (zoneType==1)
{
fprintf(fp,"%d, 4, %lf, %lf, %.2lf, 0, 0D, 01\n", zoneID, xPoints[3], yPoints[3], height);
}
fclose(fp);
}
//显示区域
OnShowGivenLine(filename);
}
m_map.RemoveLayer(m_tempZoneLayerID);
m_map.Redraw();
}
/*根据对角线两点坐标计算矩形的顶点
*point1:
*point2线
*xPoints:x
*yPoints:y
*/
void CGISDlg::ComputeRectanglePoints(double* point1,double* point2,double* xPoints,double* yPoints)
{
if((point1[0]<point2[0] && point1[1]>point2[1]) || (point1[0]>point1[1] && point1[1]<point2[1]))
{
xPoints[0] = point1[0];
xPoints[1] = point2[0];
xPoints[2] = point2[0];
xPoints[3] = point1[0];
xPoints[4] = point1[0];
yPoints[0] = point1[1];
yPoints[1] = point1[1];
yPoints[2] = point2[1];
yPoints[3] = point2[1];
yPoints[4] = point1[1];
}
if ((point1[0]<point2[0] && point1[1]<point2[1]) || (point1[0]>point2[0] && point1[1]>point2[1]))
{
xPoints[0] = point1[0];
xPoints[1] = point1[0];
xPoints[2] = point2[0];
xPoints[3] = point2[0];
xPoints[4] = point1[0];
yPoints[0] = point1[1];
yPoints[1] = point2[1];
yPoints[2] = point2[1];
yPoints[3] = point1[1];
yPoints[4] = point1[1];
}
};
//绘制限飞区
void CGISDlg::DrawRestrictedZone(long& layerID,double* xPoints,double* yPoints,int nPoints,int type)
{
if (layerID>=0)
{
m_map.RemoveLayer(layerID);
layerID = -1;
}
mapWindow::IShapePtr shapePtr;
shapePtr.CreateInstance("MapWinGIS.Shape");
//创建面矢量shapfile
shapePtr->Create(mapWindow::SHP_POLYGON);
CreateEmptyShapfile(layerID,2,RGB(255,0,0));
for (long i=0; i<nPoints; i++)
{
mapWindow::IPointPtr pintPtr;
pintPtr.CreateInstance("MapWinGIS.Point");
//经度
pintPtr->x = xPoints[i];
//纬度
pintPtr->y = yPoints[i];
shapePtr->InsertPoint(pintPtr, &i);
//插入面矢量
(m_map.GetShapefile(layerID)).EditInsertShape(shapePtr, &i);
}
mapWindow::IShapeDrawingOptionsPtr pShapeDrawingOption;
pShapeDrawingOption.CreateInstance("MapWinGIS.ShapeDrawingOptions");
if(type == 0){//限飞区黄色
pShapeDrawingOption->LineColor = RGB(250,173,20);
pShapeDrawingOption->FillColor = RGB(254,252,233);//RGB(244,206,199);
}else if(type==1){ //禁飞区红色
pShapeDrawingOption->LineColor = RGB(220,38,38);
pShapeDrawingOption->FillColor = RGB(254,243,243);//RGB(244,206,199);
}
pShapeDrawingOption->LineWidth = 2;
pShapeDrawingOption->FillTransparency = 180; //透明度
(m_map.GetShapefile(layerID)).SetDefaultDrawingOptions(pShapeDrawingOption);
};
//清除限飞区
void CGISDlg::ClearZoneLayer(long& zoneID)
{
if (zoneID>=0)
{
m_map.RemoveLayer(zoneID);
zoneID = -1;
}
}
void CGISDlg::arrayDouble2Variant(double *pArray,int iDimlength,VARIANT &vaArray)
{
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound=0;
rgsabound[0].cElements=iDimlength;
psa = SafeArrayCreate(VT_R8,1,rgsabound);
long lIndex[1];
for (int k=0; k < iDimlength; k++)
{
lIndex[0]=k;
SafeArrayPutElement(psa,lIndex,&pArray[k]);
}
vaArray.vt = VT_ARRAY|VT_R8;
vaArray.parray= psa;
}
/**************************************************************************************************/
//设计限制区
void CGISDlg::OnDesignZone(){
m_map.SetCursorMode(mapWindow::cmNone);
bDrawRestrictedZone = true;
}
void CGISDlg::OnImportZone(){
//未加载地图,返回
if (!m_bHaveAddMap)
{
return;
}
//弹出文件对话框
CFileDialog dlg(true, ".txt","*.txt",OFN_HIDEREADONLY, "限制区文件(*.txt)|*.txt|", NULL);
if (dlg.DoModal() == IDOK)
{
//读取航路文件,并标绘出来
OnShowGivenLine(dlg.GetPathName());
}
}
void CGISDlg::SetZoneState(long& zoneLayerID)
{
//已经标绘,清除航线
if (zoneLayerID>=0 )
{
//清除标绘的航线
ClearZoneLayer(zoneLayerID);
//刷新
m_map.Redraw();
}
else
{
TCHAR filter[500]=_T("限制区文件(*.txt)\0*.txt\0");
CFileDialog LineRouteDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter, NULL);
//LineRouteDlg.m_ofn.lpstrInitialDir = strRouteFileDir;
LineRouteDlg.m_ofn.lpstrFilter="txt(*.txt)\0*.txt";
LineRouteDlg.m_ofn.lpstrTitle = "选择显示最新生成的限制区";
if (LineRouteDlg.DoModal() == IDOK) //用户单击OK按钮中止对话框的返回值
{
CString str = LineRouteDlg.GetPathName(); //获取文件路径名
//OnShowGivenLine(GetFlyLineName(lineID));
OnShowGivenLine(str);
}
}
}
void CGISDlg::SetMenuZoneCheck(CMenu& menu){
if (restrictedZoneLayersID[0]>=0)
{
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE1, MF_BYCOMMAND | MF_CHECKED );
}
else
{
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE1, MF_BYCOMMAND | MF_UNCHECKED );
}
if (restrictedZoneLayersID[1]>=0)
{
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE2, MF_BYCOMMAND | MF_CHECKED );
}
else
{
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE2, MF_BYCOMMAND | MF_UNCHECKED );
}
if (restrictedZoneLayersID[2]>=0)
{
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE3, MF_BYCOMMAND | MF_CHECKED );
}
else
{
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE3, MF_BYCOMMAND | MF_UNCHECKED );
}
if (restrictedZoneLayersID[3]>=0)
{
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE4, MF_BYCOMMAND | MF_CHECKED );
}
else
{
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE4, MF_BYCOMMAND | MF_UNCHECKED );
}
if (restrictedZoneLayersID[4]>=0)
{
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE5, MF_BYCOMMAND | MF_CHECKED );
}
else
{
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE5, MF_BYCOMMAND | MF_UNCHECKED );
}
if (noFlyZoneLayersID[0]>=0)
{
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE1, MF_BYCOMMAND | MF_CHECKED );
}
else
{
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE1, MF_BYCOMMAND | MF_UNCHECKED );
}
if (noFlyZoneLayersID[1]>=0)
{
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE2, MF_BYCOMMAND | MF_CHECKED );
}
else
{
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE2, MF_BYCOMMAND | MF_UNCHECKED );
}
if (noFlyZoneLayersID[2]>=0)
{
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE3, MF_BYCOMMAND | MF_CHECKED );
}
else
{
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE3, MF_BYCOMMAND | MF_UNCHECKED );
}
if (noFlyZoneLayersID[3]>=0)
{
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE4, MF_BYCOMMAND | MF_CHECKED );
}
else
{
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE4, MF_BYCOMMAND | MF_UNCHECKED );
}
if (noFlyZoneLayersID[4]>=0)
{
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE5, MF_BYCOMMAND | MF_CHECKED );
}
else
{
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE5, MF_BYCOMMAND | MF_UNCHECKED );
}
}
void CGISDlg::OnShowRestrictedZone1(){
SetZoneState(restrictedZoneLayersID[0]);
}
void CGISDlg::OnShowRestrictedZone2(){
SetZoneState(restrictedZoneLayersID[1]);
}
void CGISDlg::OnShowRestrictedZone3(){
SetZoneState(restrictedZoneLayersID[2]);
}
void CGISDlg::OnShowRestrictedZone4(){
SetZoneState(restrictedZoneLayersID[3]);
}
void CGISDlg::OnShowRestrictedZone5(){
SetZoneState(restrictedZoneLayersID[4]);
}
void CGISDlg::OnShowNoFlyZone1(){
SetZoneState(noFlyZoneLayersID[0]);
}
void CGISDlg::OnShowNoFlyZone2(){
SetZoneState(noFlyZoneLayersID[1]);
}
void CGISDlg::OnShowNoFlyZone3(){
SetZoneState(noFlyZoneLayersID[2]);
}
void CGISDlg::OnShowNoFlyZone4(){
SetZoneState(noFlyZoneLayersID[3]);
}
void CGISDlg::OnShowNoFlyZone5(){
SetZoneState(noFlyZoneLayersID[4]);
}
void CGISDlg::OnBindZone(){
m_struMapOut.cmd=MapCmd_BindZone;
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,0,0);
}

@ -36,6 +36,7 @@
#include <map>
#include "MapElevation.h"
#include "../Include/8BMapDLL_type.h"
#include "SaveZoneDlg.h"
using namespace B8MapDLL;
#define MESSAGE_B8MAP WM_USER+750
@ -247,6 +248,19 @@ private: // by Wu
void ShowModifyPointDlg(int selectedPointID=0); //编辑航线时,显示航点设置对话框
void ShowEditSaveDlg(); //显示保存编辑对话框
void EndPolylineMessure(); //测量结束
//绘制禁飞区、限飞区
long noFlyZoneLayersID[5]; //禁飞区
long restrictedZoneLayersID[5]; //限飞区
long m_tempZoneLayerID;
bool bDrawRestrictedZone;
bool bShowZone;
double firstZonePoint[2];
void DrawRestrictedZone(long& layerID,double* xPoints,double* yPoints,int nPoints,int type);
void ClearZoneLayer(long& zoneID);
void ComputeRectanglePoints(double* point1,double* point2,double* xPoints,double* yPoints);
void ShowSaveZoneDlg(double* xPoints,double* yPoints);
void ShowGivenZone();
void arrayDouble2Variant(double *pArray,int iDimlength,VARIANT &vaArray);
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
@ -910,6 +924,29 @@ public:
afx_msg void OnShowLine14();
afx_msg void OnUpdateShowLine14(CCmdUI *pCmdUI);
/****************************限制区菜单事件************************************/
void OnDesignZone(); //限制区设计
void OnImportZone(); //导入限制区文件
//显示限飞区1-5
void OnShowRestrictedZone1();
void OnShowRestrictedZone2();
void OnShowRestrictedZone3();
void OnShowRestrictedZone4();
void OnShowRestrictedZone5();
//设置限制区状态
void SetZoneState(long& zoneLayerID);
//设置限制区菜单勾选
void SetMenuZoneCheck(CMenu& menu);
//显示禁飞区
void OnShowNoFlyZone1();
void OnShowNoFlyZone2();
void OnShowNoFlyZone3();
void OnShowNoFlyZone4();
void OnShowNoFlyZone5();
//装订限制区
void OnBindZone();
};
//{{AFX_INSERT_LOCATION}}

@ -81,6 +81,21 @@ bool SearchDirectory(const CString &strDir)
}
}
//功能:新建文件夹
//输入文件夹名称strDir
//返回值true——创建成功
// false——创建失败
extern bool CreateDirectory(const CString &strDir)
{
CString File_directory(strDir);
if (!PathIsDirectory(File_directory))//创建文件夹
{
CreateDirectory(File_directory, NULL);
}
return true;
}
//功能一个字节分成8位分别存储到数组中
//输入字节oneByte

@ -158,6 +158,12 @@ extern CString GetSoftwareCurrentDirectory();
// false——不存在该文件或文件夹
extern bool SearchDirectory(const CString &strDir);
//功能:新建文件夹
//输入文件夹名称strDir
//返回值true——创建成功
// false——创建失败
extern bool CreateDirectory(const CString &strDir);
//功能一个字节分成8位分别存储到数组中
//输入字节oneByte
//输出8位的位集合bitArray

@ -158,11 +158,6 @@ bool CModifyLinePointDlg::checkLon(string strLon,int type)
}
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);
@ -180,11 +175,6 @@ bool CModifyLinePointDlg::checkLat(string strLat,int type)
}
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);

@ -0,0 +1,119 @@
// SaveZoneDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "SaveZoneDlg.h"
#include "afxdialogex.h"
// SaveZoneDlg 对话框
IMPLEMENT_DYNAMIC(CSaveZoneDlg, CBCGPDialog)
CSaveZoneDlg::CSaveZoneDlg(CWnd* pParent /*=NULL*/)
: CBCGPDialog(CSaveZoneDlg::IDD, pParent)
{
EnableVisualManagerStyle(TRUE, TRUE);
g_Height = 0;
g_ZoneID = 1;
g_ZoneType = 0;
}
CSaveZoneDlg::~CSaveZoneDlg()
{
}
void CSaveZoneDlg::DoDataExchange(CDataExchange* pDX)
{
CBCGPDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO_ZONETYPE, m_ZoneType);
DDX_Control(pDX, IDC_COMBO_ZONEID, m_ZoneID);
DDX_Control(pDX, IDC_EDIT_HEIGHT, m_EditHeight);
}
BEGIN_MESSAGE_MAP(CSaveZoneDlg, CBCGPDialog)
ON_BN_CLICKED(IDOK, &CSaveZoneDlg::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &CSaveZoneDlg::OnBnClickedCancel)
ON_CBN_SELCHANGE(IDC_COMBO_ZONETYPE, &CSaveZoneDlg::OnCbnSelchangeComboZonetype)
END_MESSAGE_MAP()
BOOL CSaveZoneDlg::OnInitDialog()
{
CBCGPDialog::OnInitDialog();
CenterWindow();
m_ZoneType.InsertString(0, _T("限飞区") );
m_ZoneType.InsertString(1, _T("禁飞区") );
m_ZoneType.SetCurSel(0);
CString cstr;
for(int i=0;i<5;i++)
{
cstr.Format(_T("%d"), i+1);
m_ZoneID.InsertString(i, cstr );
}
m_ZoneID.SetCurSel(0);
m_EditHeight.SetWindowTextA("120");
return TRUE;
}
// SaveZoneDlg 消息处理程序
void CSaveZoneDlg::OnBnClickedOk()
{
CString strValue;
GetDlgItemText(IDC_EDIT_HEIGHT, strValue);
double height = atof(strValue);
if(height <10 || height>300)
{
BCGPMessageBox( _T( "限飞高度值在10-300m之间!"));
return;
}
g_Height = height;
g_ZoneType = ( ( CComboBox * ) GetDlgItem( IDC_COMBO_ZONETYPE ) )->GetCurSel();
g_ZoneID = ( ( CComboBox * ) GetDlgItem( IDC_COMBO_ZONEID ) )->GetCurSel() + 1;
if (g_ZoneType == 1) g_Height=0;
this->OnOK();
}
void CSaveZoneDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
this->OnCancel();
}
int CSaveZoneDlg::GetZoneType()
{
return g_ZoneType;
}
int CSaveZoneDlg::GetZoneID()
{
return g_ZoneID;
}
double CSaveZoneDlg::GetHeight()
{
return g_Height;
}
void CSaveZoneDlg::OnCbnSelchangeComboZonetype()
{
CString str;
GetDlgItem(IDC_COMBO_ZONETYPE)->GetWindowText(str);
if(str == "禁飞区")
{
GetDlgItem(IDC_EDIT_HEIGHT)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_EDIT_HEIGHT)->EnableWindow(true);
}
}

@ -0,0 +1,43 @@
#pragma once
#include "Resource.h"
#include "Globe.h"
#include "afxwin.h"
#include "../Include/8BMapDLL_type.h"
using namespace B8MapDLL;
// SaveZoneDlg 对话框
class CSaveZoneDlg : public CBCGPDialog
{
DECLARE_DYNAMIC(CSaveZoneDlg)
public:
CSaveZoneDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CSaveZoneDlg();
// 对话框数据
enum { IDD = IDD_DIALOG_ZONESETTING };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
CComboBox m_ZoneType;
CComboBox m_ZoneID;
CEdit m_EditHeight;
int GetZoneType();
int GetZoneID();
double GetHeight();
private:
int g_ZoneType;
int g_ZoneID;
double g_Height;
public:
afx_msg void OnCbnSelchangeComboZonetype();
};

@ -140,11 +140,14 @@
#define IDC_BTN_SAVEEDIT 1048
#define IDC_COMBO_TYPE2 1048
#define IDC_COMBO_POINTID 1048
#define IDC_COMBO_ZONEID 1048
#define IDD_DIALOG2 1049
#define IDD_SAVELINE 1049
#define IDC_BTN_CANCELEDIT 1049
#define IDC_COMBO_TYPE_XY 1050
#define IDC_EDIT_HEIGHT 1050
#define IDD_DIALOG_LIGHTREGION 1051
#define IDC_COMBO_ZONETYPE 1051
#define IDC_EDIT_MARKER_LON 1055
#define IDR_TOOLBAR3 1056
#define IDC_EDIT_MARKER_LAT 1056
@ -223,6 +226,7 @@
#define IDB_BITMAP39 1149
#define IDB_BITMAP40 1150
#define IDB_BITMAP41 1154
#define IDD_DIALOG_ZONESETTING 1169
#define IDT_GIS_CTRL_BUTTON1 1231
#define IDT_GIS_CTRL_BUTTON2 1232
#define IDT_GIS_CTRL_BUTTON3 1233
@ -370,14 +374,42 @@
#define ID_SHOW_BACKLINE 32909
#define ID_BIND_BACKLINE 32910
#define IDM_BINDLINE4 32911
#define ID__32912 32912
#define ID_32913 32913
#define ID_32914 32914
#define ID_32915 32915
#define ID_32916 32916
#define ID_32917 32917
#define ID_32918 32918
#define ID_32919 32919
#define ID_32920 32920
#define ID_32921 32921
#define ID_32922 32922
#define ID_32923 32923
#define ID_32924 32924
#define IDM_DESIGN_ZONE 32925
#define IDM_IMPORT_ZONE 32926
#define IDM_SHOW_ 32927
#define IDM_SHOW_RESTRICTEDZONE1 32928
#define IDM_SHOW_RESTRICTEDZONE2 32929
#define IDM_SHOW_RESTRICTEDZONE3 32930
#define IDM_SHOW_RESTRICTEDZONE4 32931
#define IDM_SHOW_RESTRICTEDZONE5 32932
#define IDM_SHOW_NOFLYZONE1 32933
#define IDM_SHOW_NOFLYZONE2 32934
#define IDM_SHOW_NOFLYZONE3 32935
#define IDM_SHOW_NOFLYZONE4 32936
#define IDM_SHOW_NOFLYZONE5 32937
#define ID_32938 32938
#define IDM_BIND_ZONE 32939
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 1169
#define _APS_NEXT_COMMAND_VALUE 32912
#define _APS_NEXT_CONTROL_VALUE 1050
#define _APS_NEXT_RESOURCE_VALUE 1170
#define _APS_NEXT_COMMAND_VALUE 32940
#define _APS_NEXT_CONTROL_VALUE 1052
#define _APS_NEXT_SYMED_VALUE 1000
#endif
#endif

Loading…
Cancel
Save