diff --git a/GISControlDlg.rc b/GISControlDlg.rc index 6243423..66c11fa 100644 --- a/GISControlDlg.rc +++ b/GISControlDlg.rc @@ -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 diff --git a/GISControlDlg.vcxproj b/GISControlDlg.vcxproj index 1f98ed3..28b2edf 100644 --- a/GISControlDlg.vcxproj +++ b/GISControlDlg.vcxproj @@ -281,6 +281,7 @@ %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -404,6 +405,7 @@ + diff --git a/GISControlDlg.vcxproj.filters b/GISControlDlg.vcxproj.filters index 47e299c..00a224c 100644 --- a/GISControlDlg.vcxproj.filters +++ b/GISControlDlg.vcxproj.filters @@ -180,6 +180,9 @@ Source Files + + Source Files + @@ -421,5 +424,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/GISDlg.cpp b/GISDlg.cpp index 8686b85..0183437 100644 --- a/GISDlg.cpp +++ b/GISDlg.cpp @@ -20,6 +20,8 @@ #include "vectortoraster.h" #include "SaveLineEditSetting.h" #include "ModifyLinePointDlg.h" +#include +#include #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[1]) || (point1[0]>point1[1] && point1[1]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; ix = 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); +} + + + + + + + + + + diff --git a/GISDlg.h b/GISDlg.h index becf507..8c49d9b 100644 --- a/GISDlg.h +++ b/GISDlg.h @@ -36,6 +36,7 @@ #include #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}} diff --git a/Globe.cpp b/Globe.cpp index ee64dda..d8e28f1 100644 --- a/Globe.cpp +++ b/Globe.cpp @@ -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 diff --git a/Globe.h b/Globe.h index 987d3c7..af5b5a1 100644 --- a/Globe.h +++ b/Globe.h @@ -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 diff --git a/ModifyLinePointDlg.cpp b/ModifyLinePointDlg.cpp index ab506eb..13729c9 100644 --- a/ModifyLinePointDlg.cpp +++ b/ModifyLinePointDlg.cpp @@ -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); diff --git a/SaveZoneDlg.cpp b/SaveZoneDlg.cpp new file mode 100644 index 0000000..973b39a --- /dev/null +++ b/SaveZoneDlg.cpp @@ -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); + } +} diff --git a/SaveZoneDlg.h b/SaveZoneDlg.h new file mode 100644 index 0000000..7f7ae04 --- /dev/null +++ b/SaveZoneDlg.h @@ -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(); +}; diff --git a/resource.h b/resource.h index 7c7cc89..c61622f 100644 --- a/resource.h +++ b/resource.h @@ -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