|
|
|
@ -1,12 +1,14 @@
|
|
|
|
|
|
|
|
|
|
#include "mainwindow.h"
|
|
|
|
|
#include "FileParser/UGModelConfigParams.h"
|
|
|
|
|
#include "collisiondetectionthread.h"
|
|
|
|
|
#include "computeoffsetpositiondialog.h"
|
|
|
|
|
#include "displayroutedialog.h"
|
|
|
|
|
#include "geospatialanalysis.h"
|
|
|
|
|
#include "importscenedatadialog.h"
|
|
|
|
|
#include "maplocationdialog.h"
|
|
|
|
|
#include "qregularexpression.h"
|
|
|
|
|
#include "realtimepositioninfothread.h"
|
|
|
|
|
#include "routeglobalvariant.h"
|
|
|
|
|
#include "ui_mainwindow.h"
|
|
|
|
|
|
|
|
|
@ -33,11 +35,14 @@
|
|
|
|
|
#include <QProgressDialog>
|
|
|
|
|
#include <QRegularExpressionValidator>
|
|
|
|
|
#include <QThreadPool>
|
|
|
|
|
#include <QSystemTrayIcon>
|
|
|
|
|
|
|
|
|
|
#include "math.h"
|
|
|
|
|
#include "cmath"
|
|
|
|
|
#include "mapdatamaneger.h"
|
|
|
|
|
#include "loadscenedatathread.h"
|
|
|
|
|
#include "symbolresources.h"
|
|
|
|
|
#include "QNotify/NotifyManager.h"
|
|
|
|
|
//三维
|
|
|
|
|
#include "sceneview.h"
|
|
|
|
|
#include "workspace.h"
|
|
|
|
@ -102,10 +107,8 @@
|
|
|
|
|
//#include "FileParser/UGFileParserTile.h"
|
|
|
|
|
//#include "FileParser/UGSimpleConfigParams.h"
|
|
|
|
|
//#include "FileParser/UGFileParseVector.h"
|
|
|
|
|
|
|
|
|
|
#include "Symbol/UGMarkerSymbolLib.h"
|
|
|
|
|
|
|
|
|
|
#include "erkir/sphericalpoint.h"
|
|
|
|
|
|
|
|
|
|
//工作空间及数据源默认存储路径及别名
|
|
|
|
|
const QString wsName = "MapWorkspace"; //工作空间别名
|
|
|
|
@ -386,26 +389,20 @@ MainWindow::MainWindow(QWidget *parent)
|
|
|
|
|
QString demName = "ASTGTMV003_N32E119_dem";
|
|
|
|
|
qMapControl->addDEMDataset(demName);
|
|
|
|
|
|
|
|
|
|
UGPoint2D ptView(119.703784,32.228956);
|
|
|
|
|
UGPoint2D ptObject(119.707676,32.227302);
|
|
|
|
|
GeoSpatialAnalysis geoSAnalysis;
|
|
|
|
|
UG3DAnalyst::SingleResult* result = geoSAnalysis.DoublePointVisibility(qMapControl,ptView,ptObject);
|
|
|
|
|
if(!result==NULL)
|
|
|
|
|
{
|
|
|
|
|
qDebug()<<"*******************bVisible:"<<result->bVisible;
|
|
|
|
|
qDebug()<<"*******************x:"<<result->pnt3D.x;
|
|
|
|
|
qDebug()<<"*******************y:"<<result->pnt3D.y;
|
|
|
|
|
qDebug()<<"*******************z:"<<result->pnt3D.z;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
erkir::spherical::Point p1{ 52.205, 0.119 };
|
|
|
|
|
erkir::spherical::Point p2{ 48.857, 2.351 };
|
|
|
|
|
auto d = p1.distanceTo(p2); // 404.3 km
|
|
|
|
|
// UGPoint2D ptView(119.708645,32.234523);
|
|
|
|
|
// UGPoint2D ptObject(119.711544,32.223927);
|
|
|
|
|
// GeoSpatialAnalysis geoSAnalysis;
|
|
|
|
|
// UG3DAnalyst::SingleResult* result = geoSAnalysis.DoublePointVisibility(qMapControl,ptView,ptObject,14);
|
|
|
|
|
// if(!result==NULL)
|
|
|
|
|
// {
|
|
|
|
|
// qDebug()<<"*******************bVisible:"<<result->bVisible;
|
|
|
|
|
// qDebug()<<"*******************x:"<<QString::number(result->pnt3D.x,'f',6);
|
|
|
|
|
// qDebug()<<"*******************y:"<<QString::number(result->pnt3D.y,'f',6);
|
|
|
|
|
// qDebug()<<"*******************z:"<<QString::number(result->pnt3D.z,'f',6);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
erkir::spherical::Point p3{ 51.4778, -0.0015 };
|
|
|
|
|
auto dest = p3.destinationPoint(7794.0, 300.7); // 51.5135°N, 000.0983°W
|
|
|
|
|
qDebug()<<"*******************z:"<<abs(-1);
|
|
|
|
|
|
|
|
|
|
qDebug()<<"*******************z:";
|
|
|
|
|
/*
|
|
|
|
|
qDebug()<<"****************:" <<QDir("./").absolutePath();
|
|
|
|
|
UGDatasetVector* dv = (UGDatasetVector*) m_pWorkspace->GetDataSource(0)->GetDataset(line3DSetAlias).get();
|
|
|
|
@ -462,6 +459,39 @@ void MainWindow::setupUI(QMainWindow *mainWindow)
|
|
|
|
|
|
|
|
|
|
//初始化工具条
|
|
|
|
|
initMainToolBar(mainWindow);
|
|
|
|
|
|
|
|
|
|
//初始化消息通知对象
|
|
|
|
|
initNotifyManager();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//全局消息通知对象初始化设置
|
|
|
|
|
void MainWindow::initNotifyManager()
|
|
|
|
|
{
|
|
|
|
|
notifyManager = new NotifyManager(this);
|
|
|
|
|
notifyManager->setMaxCount(5);
|
|
|
|
|
notifyManager->setDisplayTime(3000);
|
|
|
|
|
notifyManager->setNotifyWndSize(500, 140);
|
|
|
|
|
notifyManager->setStyleSheet("#notify-background {"
|
|
|
|
|
"background: black;"
|
|
|
|
|
"}"
|
|
|
|
|
"#notify-title{"
|
|
|
|
|
"font: bold 24px 微软雅黑;"
|
|
|
|
|
"color: #eeeeee;"
|
|
|
|
|
"}"
|
|
|
|
|
"#notify-body{"
|
|
|
|
|
"font: 22px 微软雅黑;"
|
|
|
|
|
"color: #dddddd;"
|
|
|
|
|
"}"
|
|
|
|
|
"#notify-close-btn{ "
|
|
|
|
|
"border: 0;"
|
|
|
|
|
"color: #999999;"
|
|
|
|
|
"}"
|
|
|
|
|
"#notify-close-btn:hover{ "
|
|
|
|
|
"background: #444444;"
|
|
|
|
|
"}", "black");
|
|
|
|
|
// QVariantMap data;
|
|
|
|
|
// data["icon"] = ":/Resources/WarningLevel1.png"; // 自定义消息图标,也可传入QPixmap
|
|
|
|
|
// notifyManager->notify("新消息","前方910m存在高度为126m的地形障碍物;大约45s到达;请尽快提高飞行高度!",data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//工作空间初始化
|
|
|
|
@ -700,6 +730,10 @@ void MainWindow::addMapAction(QMainWindow *mainWindow)
|
|
|
|
|
actionImportData = new QAction(QIcon(":/Resources/import_data.png"),"导入数据",this);
|
|
|
|
|
mainToolBar->addAction(actionImportData);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************Test*******************************/
|
|
|
|
|
actionTest = new QAction(QIcon("D:/supermap-iobjectscpp/MyProject/MapDisplay/Resources/Test.png"),"测试",this);
|
|
|
|
|
mainToolBar->addAction(actionTest);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//添加地图右键菜单QAction
|
|
|
|
@ -739,6 +773,9 @@ void MainWindow::addEditToolAction()
|
|
|
|
|
//Map连接信号和槽的函数
|
|
|
|
|
void MainWindow::addMapConnect()
|
|
|
|
|
{
|
|
|
|
|
connect(actionTest,&QAction::triggered,this,&MainWindow::test);
|
|
|
|
|
/*********************************以上连接仅用于测试**************************************/
|
|
|
|
|
|
|
|
|
|
connect(qMapControl,&QMapControl::sendPreviousPoint,inputPosDlg,&ComputeOffsetPositionDialog::acceptPresiousPoint);
|
|
|
|
|
connect(inputPosDlg,&ComputeOffsetPositionDialog::sendComputedPoint,qMapControl,&QMapControl::clickedComputedPoint);
|
|
|
|
|
|
|
|
|
@ -2257,7 +2294,151 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
|
|
|
|
|
sceneRBtnMenu->exec(QCursor::pos()); // 右键菜单被模态显示出来了
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// qDebug()<<"*****************contextMenuEvent:";
|
|
|
|
|
// qDebug()<<"*****************contextMenuEvent:";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//启动接收实时位置数据总线程
|
|
|
|
|
void MainWindow::startReceiveRealTimePositionInfoThread()
|
|
|
|
|
{
|
|
|
|
|
receiveRealTimePositionInfoThread = new QThread;
|
|
|
|
|
receiveRealTimePositionInfoTask = new RealTimePositionInfoThread;
|
|
|
|
|
receiveRealTimePositionInfoTask->moveToThread(receiveRealTimePositionInfoThread);
|
|
|
|
|
receiveRealTimePositionInfoThread->start();
|
|
|
|
|
}
|
|
|
|
|
//关闭接收实时位置数据总线程
|
|
|
|
|
void MainWindow::closeReceiveRealTimePositionInfoThread()
|
|
|
|
|
{
|
|
|
|
|
receiveRealTimePositionInfoTask->deleteLater();
|
|
|
|
|
receiveRealTimePositionInfoThread->quit();
|
|
|
|
|
receiveRealTimePositionInfoThread->wait();
|
|
|
|
|
receiveRealTimePositionInfoThread->deleteLater();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//启动碰撞检测子线程
|
|
|
|
|
void MainWindow::startCollisionDetectThread(int ms)
|
|
|
|
|
{
|
|
|
|
|
collisionThread = new QThread;
|
|
|
|
|
collisionDetectionTask = new CollisionDetectionThread(qMapControl);
|
|
|
|
|
collisionDetectionTask->moveToThread(collisionThread);
|
|
|
|
|
collisionThread->start();
|
|
|
|
|
|
|
|
|
|
connect(receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::sendCollisionDetectPosInfo,collisionDetectionTask,&CollisionDetectionThread::receiveLocationData);
|
|
|
|
|
connect(collisionDetectionTask,&CollisionDetectionThread::requestPositionInfo,receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::startSendCollisionDetectionPosInfo);
|
|
|
|
|
connect(this,&MainWindow::startCollisionDetect,collisionDetectionTask,&CollisionDetectionThread::start);
|
|
|
|
|
connect(receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::sendCollisionDetectPosInfo,collisionDetectionTask,&CollisionDetectionThread::receiveLocationData);
|
|
|
|
|
connect(collisionDetectionTask,&CollisionDetectionThread::showNotify,this,&MainWindow::showNotify);
|
|
|
|
|
|
|
|
|
|
connect(collisionDetectionTask,&CollisionDetectionThread::closedCollisionDetection,receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::stopSendCollisionDetectionPosInfo);
|
|
|
|
|
|
|
|
|
|
emit startCollisionDetect(ms);
|
|
|
|
|
}
|
|
|
|
|
//关闭碰撞检测子线程
|
|
|
|
|
void MainWindow::closeCollisionDetectThread()
|
|
|
|
|
{
|
|
|
|
|
connect(this,&MainWindow::closeCollisionDetect,collisionDetectionTask,&CollisionDetectionThread::closedCollisionDetection);
|
|
|
|
|
connect(collisionThread,&QThread::finished,[=](){
|
|
|
|
|
collisionThread->deleteLater();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
emit closeCollisionDetect();
|
|
|
|
|
collisionDetectionTask->deleteLater();//任务对象销毁
|
|
|
|
|
collisionThread->quit();//结束线程消息循环
|
|
|
|
|
collisionThread->wait();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//********用于测试*************
|
|
|
|
|
void MainWindow::test()
|
|
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
QTimer* sendData = new QTimer;
|
|
|
|
|
sendData->setInterval(200);
|
|
|
|
|
// QPointF pt;
|
|
|
|
|
pt.setX(119.668);
|
|
|
|
|
pt.setY(32.23);
|
|
|
|
|
// QList<double> lon, lat, heading,speed,relativeAlititude;
|
|
|
|
|
// GeoComputation geoComputation;
|
|
|
|
|
connect(sendData,&QTimer::timeout,this,[=](){
|
|
|
|
|
// qDebug()<<"***************TimeOut:";
|
|
|
|
|
// int i = 0;
|
|
|
|
|
lon.clear();
|
|
|
|
|
lat.clear();
|
|
|
|
|
heading.clear();
|
|
|
|
|
speed.clear();
|
|
|
|
|
relativeAlititude.clear();
|
|
|
|
|
pt = geoComputation.getDestinationPoint(pt.x(),pt.y(),90,4);
|
|
|
|
|
lon.append(pt.x());
|
|
|
|
|
lat.append(pt.y());
|
|
|
|
|
heading.append(90);
|
|
|
|
|
speed.append(20);
|
|
|
|
|
relativeAlititude.append(50);
|
|
|
|
|
// qDebug()<<"***************lon:"<<lon.takeLast();
|
|
|
|
|
// qDebug()<<"***************lat:"<<lat.takeLast();
|
|
|
|
|
// qDebug()<<"***************heading:"<<heading.takeLast();
|
|
|
|
|
// qDebug()<<"*********************************";
|
|
|
|
|
emit sendPositionData1(lon,lat,heading);
|
|
|
|
|
});
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
testFlag = !testFlag;
|
|
|
|
|
|
|
|
|
|
qDebug()<<"*******************:"<<testFlag;
|
|
|
|
|
qDebug() << "MainThread address: " << QThread::currentThread();
|
|
|
|
|
/*
|
|
|
|
|
receiveRealTimePositionInfoThread = new QThread;
|
|
|
|
|
receiveRealTimePositionInfoTask = new RealTimePositionInfoThread;
|
|
|
|
|
receiveRealTimePositionInfoTask->moveToThread(receiveRealTimePositionInfoThread);
|
|
|
|
|
receiveRealTimePositionInfoThread->start();
|
|
|
|
|
|
|
|
|
|
collisionThread = new QThread;
|
|
|
|
|
collisionDetectionTask = new CollisionDetectionThread(qMapControl);
|
|
|
|
|
collisionDetectionTask->moveToThread(collisionThread);
|
|
|
|
|
collisionThread->start();
|
|
|
|
|
connect(collisionDetectionTask,&CollisionDetectionThread::showNotify,this,&MainWindow::showNotify);
|
|
|
|
|
connect(collisionDetectionTask,&CollisionDetectionThread::requestPositionInfo,receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::startSendCollisionDetectionPosInfo);
|
|
|
|
|
connect(this,&MainWindow::startCollisionDetect,collisionDetectionTask,&CollisionDetectionThread::start);
|
|
|
|
|
connect(receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::sendCollisionDetectPosInfo,collisionDetectionTask,&CollisionDetectionThread::receiveLocationData);
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
startReceiveRealTimePositionInfoThread();
|
|
|
|
|
|
|
|
|
|
QThread* sendDataThread = new QThread;
|
|
|
|
|
SendDataTestThread* sendDataTask = new SendDataTestThread;
|
|
|
|
|
sendDataTask->moveToThread(sendDataThread);
|
|
|
|
|
sendDataThread->start();
|
|
|
|
|
connect(sendDataTask,&SendDataTestThread::sendPositionData,receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::receiveRealTimePositionInfo);
|
|
|
|
|
connect(this,&MainWindow::startGenerate,sendDataTask,&SendDataTestThread::working);
|
|
|
|
|
connect(this,&MainWindow::stopGenerate,sendDataTask,&SendDataTestThread::stopGenerateData);
|
|
|
|
|
connect(sendDataThread,&QThread::finished,this,[=](){
|
|
|
|
|
qDebug()<<"*******************finished:";
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
//二维飞机实时位置显示测试
|
|
|
|
|
ShowPlane* m_pShowPlane = new ShowPlane(qMapControl);
|
|
|
|
|
Plane* plane = new Plane("plane1",2,119.668,32.23);
|
|
|
|
|
m_pShowPlane->addPlane(plane);
|
|
|
|
|
connect(m_pShowPlane,&ShowPlane::requestPositionInfo,receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::startSendDisplayInfo);
|
|
|
|
|
connect(receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::sendDisplayInfo,m_pShowPlane,&ShowPlane::receivePositionInfo);
|
|
|
|
|
|
|
|
|
|
if(testFlag)
|
|
|
|
|
{
|
|
|
|
|
emit startGenerate();
|
|
|
|
|
// emit startCollisionDetect(1000);
|
|
|
|
|
startCollisionDetectThread(1000);
|
|
|
|
|
}
|
|
|
|
|
m_pShowPlane->startFly();
|
|
|
|
|
// receiveRealTimePositionInfoThread->start();
|
|
|
|
|
// receiveRealTimePositionInfoTask->start();
|
|
|
|
|
// receiveRealTimePositionInfoTask->working();
|
|
|
|
|
// QThread::msleep(1000);
|
|
|
|
|
// emit stopGenerate();
|
|
|
|
|
// sendDataThread->quit();
|
|
|
|
|
|
|
|
|
|
if(!testFlag) emit testEnd();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::showNotify(QString title, QString body, QVariantMap data)
|
|
|
|
|
{
|
|
|
|
|
notifyManager->notify(title,body,data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Slot:打开栅格地图
|
|
|
|
@ -2303,12 +2484,6 @@ void MainWindow::openRasterMap()
|
|
|
|
|
dataSource = NULL;
|
|
|
|
|
|
|
|
|
|
/************************************test*******************************/
|
|
|
|
|
//二维飞机实时位置显示测试
|
|
|
|
|
// ShowPlane* m_pShowPlane = new ShowPlane(qMapControl);
|
|
|
|
|
// Plane* plane = new Plane("plane1",2,119.668,32.23);
|
|
|
|
|
// m_pShowPlane->addPlane(plane);
|
|
|
|
|
// m_pShowPlane->startFly();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// UGGeoPoint* p = new UGGeoPoint();
|
|
|
|
|
// p->SetX(119.718414);
|
|
|
|
@ -2357,6 +2532,16 @@ void MainWindow::viewEntire()
|
|
|
|
|
//平移浏览地图操作
|
|
|
|
|
void MainWindow::pan()
|
|
|
|
|
{
|
|
|
|
|
// QVariantMap data;
|
|
|
|
|
// data["icon"] = ":/Resources/WarningLevel1.png"; // 自定义消息图标,也可传入QPixmap
|
|
|
|
|
// notifyManager->notify("新消息","消息主体",data);
|
|
|
|
|
|
|
|
|
|
// QSystemTrayIcon* trayIcon = new QSystemTrayIcon(this);
|
|
|
|
|
// QIcon icon1(":/Resources/WarningLevel1.png");
|
|
|
|
|
// trayIcon->setIcon(icon1);
|
|
|
|
|
// trayIcon->show();
|
|
|
|
|
// trayIcon->showMessage("title", "this is a message",icon1,2000);
|
|
|
|
|
|
|
|
|
|
if(mapType==MapType::Map2D)
|
|
|
|
|
qMapControl->Pan();
|
|
|
|
|
else if(mapType==MapType::Map3D)
|
|
|
|
|