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.

2509 lines
100 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.

#include "mainwindow.h"
#include "FileParser/UGModelConfigParams.h"
#include "computeoffsetpositiondialog.h"
#include "displayroutedialog.h"
#include "importscenedatadialog.h"
#include "maplocationdialog.h"
#include "qregularexpression.h"
#include "routeglobalvariant.h"
#include "ui_mainwindow.h"
#include "saveroutedialog.h"
#include "bindroutedialog.h"
#include "loadonlinemapdialog.h"
#include "geofileparser.h"
#include "layeroperator.h"
#include "geofeatureoperator.h"
#include "mapthread.h"
#include "settingflightpoint3ddialog.h"
#include "plane.h"
#include "showplane.h"
#include "showplane3d.h"
#include <QToolBar>
#include <QMessageBox>
#include <QFileDialog>
#include <QDebug>
#include <QLabel>
#include <QDialog>
#include <QProgressBar>
#include <QProgressDialog>
#include <QRegularExpressionValidator>
#include <QThreadPool>
#include "math.h"
#include "cmath"
#include "mapdatamaneger.h"
#include "loadscenedatathread.h"
#include "symbolresources.h"
//三维
#include "sceneview.h"
#include "workspace.h"
#include "Scene/UGTrackingLayer3D.h"
#include "Scene/UGPlottingLayer3D.h"
#include "Scene/UGScreenLayer3D.h"
#include "Geometry3D/UGGeoPoint3D.h"
#include "Geometry3D/UGGeoModelPro.h"
#include "Render/UGCameraGlobal.h"
#include "Render/UGCameraLocal.h"
#include "Scene/UGLayer3DFactory.h"
#include "Scene/UGLayer3DManager.h"
#include "Render/UGRenderManager.h"
#include "Render/UGRenderModelPro.h"
#include "Render/UGRenderLine3D.h"
#include "Base3D/UGBoundingBox.h"
#include "Geometry/UGGeoPicture.h"
#include "Geometry3D/UGGeoPlacemark.h"
#include "Geometry3D/UGGeoBillboard.h"
#include "Geometry3D/UGGeoLine3D.h"
#include "GeometryPlot/UGGOLibraryManager.h"
#include "Layer3DFile/UGLayer3DDynamic.h"
#include "Layer3DFile/UGLayer3DModel.h"
//#include "Layer3DTree/UGLayer3DTree.h"
#include "Base3D/UGMathEngine.h"
#include "Scene/UGFlyRoute.h"
#include "Scene/UGFlyManager.h"
#include "Scene/UGFlyRoutes.h"
#include "Scene/UGFlyRouteStops.h"
#include "Scene/UGFlyRouteStop.h"
#include "Scene/UGFlyInterpolatedTool.h"
//SuperMap库
#include "qmapcontrol.h"//引用QMapControl头文件
#include "QDynamicLayers.h"
#include "QDynamicLayer.h"
#include "QDynamicObject.h"
#include "translator.h"//引用QMapControl工程中的头文件
#include "Workspace/UGWorkspace.h"//引用iObjects C++组件中的工作空间UGWorkspace头文件
#include "Workspace/UGResources.h"
#include "Map/UGMap.h"//引用iObjects C++组件中的UGMap.h头文件
#include "MapEditor/UGMapEditorWnd.h"
#include "Geometry/UGGeometry.h"
#include "Geometry/UGGeoLine.h"
//#include "Geometry/UGGeoRegion.h"
#include "Projection/UGPrjCoordSys.h"
#include "Engine/UGTable.h"
#include "Engine/UGDatasetVector.h"
#include "Engine/UGRecordset.h"
//#include "Toolkit/UGProgress.h"
//#include "Toolkit/UGRegistry.h"
#include "DataExchange/UGDataExchange.h"
#include "FileParser/UGKMLConfigParams.h"
#include "FileParser/UGKMZConfigParams.h"
#include "FileParser/UGGTiffConfigParams.h"
#include "FileParser/UGExchangeParamsManager.h"
//#include "FileParser/UGFileParseModel.h"
//#include "FileParser/UGFileParseFactory.h"
//#include "FileParser/UGFileParseManager.h"
//#include "FileParser/UG3dsConfigParams.h"
//#include "FileParser/UGFileParserTile.h"
//#include "FileParser/UGSimpleConfigParams.h"
//#include "FileParser/UGFileParseVector.h"
#include "Symbol/UGMarkerSymbolLib.h"
//工作空间及数据源默认存储路径及别名
const QString wsName = "MapWorkspace"; //工作空间别名
QString wsFullName; //工作空间存储路径
QString routeFullName; //航线数据存储路径
/*2D*/
const QString routeName = "Route"; //航线矢量数据源别名
UGString pointSetAlias = _U("Marks"); //点数据集别名
UGString lineSetAlias = _U("FlightLines"); //线数据集别名
UGString polygonSetAlias = _U("Geofencing"); //面数据集别名
UGString NodeLabelSetAlias = _U("NodeLabel"); //节点标签数据集别名
/*3D*/
//const QString route3DName = "Scene"; //三维场景数据源别名
UGString line3DSetAlias = _U("FlightLines3D"); //3D线数据集别名
//设置线段自动闭合
void UGSTDCALL AfterGeometryAddedCallback(UGlong pWnd, UGbool &bCancel, UGint nGeometryID, UGLayer *pLayer)
{//此回调函数已经往数据集添加了对象bCancel字段为是否添加本质是将已添加的记录删除
//nGeometryID 对应属性表的"SmID"字段,该字段默认是被隐藏
qDebug()<<"******************nGeometryID:"<<nGeometryID;
QMapControl* pControl = (QMapControl*)pWnd;
pControl->resetWayPointLabel();
UGRecordsetPtr editRes = pLayer->GetEditRecordset(); //只包含当前编辑线段的一条记录
// editRes->Edit();
UGDatasetVector* dv = (UGDatasetVector*)(pLayer->GetDataset().get());
//对地图操作一下防止弹出Dialog后地图消失
QPoint p = pControl->getLMousePressPoint();
pControl->GetUGMapWnd()->OnMouseMove(pControl->getGraphics(),0,Translator::QPoint2UGPoint(p));
//调出航线设置对话框
saveRouteDialog dlg;
dlg.setMaxValue(1);
dlg.setDrawMode(1);
int ret = dlg.exec();
UGGeometry* pGeometry = NULL;
UGGeoLine l;
editRes->GetGeometry(pGeometry);
QMap<QString,QString> fieldsValue;
GeoFeatureOperator geoFtOperator;
RouteGlobalVariant routeGVar;
if(ret==QDialog::Accepted)
{
fieldsValue.insert(routeGVar.routeFieldsName.RouteID,QString::number(dv->GetObjectCount()));
fieldsValue.insert(routeGVar.routeFieldsName.RouteHeight,QString::number(dlg.getRouteHeight()[1]));
fieldsValue.insert(routeGVar.routeFieldsName.RouteNumber,QString::number(dlg.getRouteNumber()[1]));
fieldsValue.insert(routeGVar.routeFieldsName.RouteType,QString::number(dlg.getRouteType()[1]));
fieldsValue.insert(routeGVar.routeFieldsName.IsClosedRoute,QString::number(dlg.getRouteClosedState()[1]));
int s = geoFtOperator.importFeatureAttribute(dv,pGeometry,fieldsValue,false);
if(s==1)
{
bCancel = true;
}
}
if(dlg.isClickedCloseBtn)
{
bCancel = true;
}
/*
if(ret==QDialog::Accepted)
{
qint16 routeID_dlg = dv->GetObjectCount(); //数量为属性集已有记录数+1
double routeHeight_dlg = dlg.getRouteHeight()[1];
int routeType_dlg = dlg.getRouteType()[1];
int routeNumber_dlg = dlg.getRouteNumber()[1];
UGString routeName_dlg = Translator::QStr2UGStr(dlg.getRouteText()+QString::number(routeNumber_dlg));
QString queryFilter = "RouteType=" + QString::number(routeType_dlg) + " and " +
("RouteNumber=") + QString::number(routeNumber_dlg);
UGRecordsetPtr saveRes = pControl->queryFeature(dv,Translator::QStr2UGStr(queryFilter));
UGGeometry* pTem = NULL;
UGGeoLine l;
if(dlg.isCloseRoute())
{//自动闭合线段
editRes->GetGeometry(pTem,0);
pTem->ConvertToLine(l,0);
UGPoint2D addPoint = l.GetStartNode();
l.InsertPoint(0,l.GetPointCount(),addPoint); //添加首节点
editRes->SetGeometry(l); //替换原线段
editRes->ModifyFieldValue(_U("IsClosedRoute"),1);
}
else
{
editRes->ModifyFieldValue(_U("IsClosedRoute"),0);
}
if(!saveRes->IsEmpty())
{//记录已存在,覆盖
QMessageBox::StandardButton saveBtn;
saveBtn = QMessageBox::question(pControl, u8"提示", u8"航线已存在,是否覆盖?", QMessageBox::Yes|QMessageBox::No);
if (saveBtn == QMessageBox::Yes)
{
saveRes->Edit();
saveRes->SetGeometry(l);
saveRes->ModifyFieldValue(_U("RouteHeight"),UGVariant(routeHeight_dlg));
saveRes->Update();
bCancel = true;
}
else
{
}
}
else
{//航线不存在,新增航线
editRes->ModifyFieldValue(_U("RouteID"),UGVariant(routeID_dlg));
editRes->ModifyFieldValue(_U("RouteNumber"),UGVariant(routeNumber_dlg));
editRes->ModifyFieldValue(_U("RouteType"),UGVariant(routeType_dlg));
editRes->ModifyFieldValue(_U("RouteHeight"),UGVariant(routeHeight_dlg));
editRes->ModifyFieldValue(_U("RouteName"),UGVariant(routeName_dlg));
//提交记录修改
editRes->Update();
}
}
*/
if(ret==QDialog::Rejected)
{
bCancel = true;
}
// pControl->GetMap()->m_Layers.ClearLayersSelection();
// pControl->GetMap()->m_Layers.Remove(pLayer);
dv = NULL;
}
#pragma region{
//void UGSTDCALL AfterGeometryDeletedProcCallback(UGlong pWnd, UGbool &bCancel, UGint nGeometryID, UGLayer *pLayer)
//{
// qDebug()<<"**************************AfterGeometryDeletedProcCallback";
// qDebug()<<"**************************AfterGeometryDeletedProcCallback";
//}
//void UGSTDCALL BeforeGeometryDeletedProcCallback(UGlong pWnd, UGbool &bCancel, UGint nGeometryID, UGLayer *pLayer)
//{
// qDebug()<<"**************************BeforeGeometryDeletedProcCallback";
// qDebug()<<"**************************BeforeGeometryDeletedProcCallback";
//}
//void UGSTDCALL BeginEditHandleProcCallback(UGlong pWnd, UGbool &bCancel, UGint nEditSelType, UGint *pHandle, UGint nCount, UGdouble dx, UGdouble dy)
//{
// qDebug()<<"**************************BeginEditHandleProcCallback";
// qDebug()<<"**************************BeginEditHandleProcCallback";
//}
//void UGSTDCALL EditHandleCanceledProcCallback(UGlong pWnd, UGint nEditSelType, UGint *pHandle, UGint nCount)
//{
// qDebug()<<"**************************EditHandleCanceledProcCallback";
// qDebug()<<"**************************EditHandleCanceledProcCallback";
//}
//void UGSTDCALL AfterGeometryModifiedProcCallback(UGlong pWnd, UGint nGeometryID, UGLayer *pLayer)
//{
// qDebug()<<"**************************AfterGeometryModifiedProcCallback";
// qDebug()<<"**************************AfterGeometryModifiedProcCallback";
//}
//void UGSTDCALL BeforeGeometryModifiedProcCallback(UGlong pWnd, UGbool &bCancel, UGint nGeometryID, UGLayer *pLayer)
//{
// qDebug()<<"**************************BeforeGeometryModifiedProcCallback";
// qDebug()<<"**************************BeforeGeometryModifiedProcCallback";
//}
//void UGSTDCALL AffterDatasetModifiedProcCallback(void* pLayerDataset,UGint nID,UGRect2D rect2D,UGModifyDatasetFlag flg)
//{
// qDebug()<<"**************************BeforeDatasetModifiedProcCallback";
// qDebug()<<"**************************BeforeDatasetModifiedProcCallback";
//}
//void UGSTDCALL TrackedProcCallback(UGlong pWnd)
//{
// qDebug()<<"**************************TrackedProcCallback";
// qDebug()<<"**************************TrackedProcCallback";
//}
#pragma endregion}
void UGSTDCALL AfterPointInputCallback(UGlong pWnd, UGdouble &dx, UGdouble &dy, UGdouble &dz)
{//dx:lon dy:lat
qDebug()<<"**************************AfterPointInputCallback";
qDebug()<<"**************************AfterPointInputCallback";
qDebug()<<"**************************x:"<<dx;
QMapControl* pControl = (QMapControl*)pWnd;
// emit pControl->beginTracking(true); //
qDebug()<<"******************drawMode:"<<pControl->drawMode;
if(pControl->drawMode>1) emit pControl->sendPreviousPoint(dx,dy);
// ComputeOffsetPositionDialog inputPosDlg;
// inputPosDlg.exec();
// double bearing = inputPosDlg.getBearing().toDouble();
// double dist = inputPosDlg.getDistance().toDouble();
}
void UGSTDCALL GeometrySelectedCallback(UGlong pWnd, UGint nSelectedGeometryCount)
{//左键点击选中触发
qDebug()<<"**************************GeometrySelectedCallback";
qDebug()<<"**************************nSelectedGeometryCount:"<<nSelectedGeometryCount;
QMapControl* pControl = (QMapControl*)pWnd;
LayerOperator LO;
QMap<int,QStringList> featureInfo;
featureInfo = LO.getSelectedFeature(pControl->GetMap());
QStringList filterlist;
QList<int> types = featureInfo.keys();
for(int i = 0; i < types.size(); i++)
{
filterlist<< "(RouteNumber in (" + featureInfo[types[i]].join(",") + ") and " + "RouteType = " + QString::number(types[i]) + ")";
}
QString filter = filterlist.join(" or ");
qDebug()<<"**************************GeometryID:"<< filter;
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
drawMode = 0;
setupUI(this);//调用界面构建函数
addMapConnect();//调用连接信号和槽的函数
// 给窗口设置策略: Qt::DefaultContextMenu
// 在窗口中按下鼠标右键, 这个事件处理器函数被qt框架调用 QWidget::contextMenuEvent()
setContextMenuPolicy(Qt::DefaultContextMenu);
SymbolResources symbolRs;
symbolRs.setResources(m_pWorkspace->GetResources());
symbolRs.reLoading();
symbolRs.addSymbol();
// UGString symbolPath = _U("D:/Symbol/Plane.sym");
// UGMarkerSymbolLib* ms = m_pWorkspace->GetResources()->GetMarkerSymbolLib();
// bool ss = ms->LoadFromFile(symbolPath);
// bool fs = ms->SaveToFile(_U("D:/test.sym"));
qDebug()<<"***********msCount:"<<m_pWorkspace->GetResources()->GetMarkerSymbolLib()->GetSymbolCount();
bool s = m_pWorkspace->GetResources()->GetMarkerSymbolLib()->IsIDExisted(318);
qDebug()<<"***********s2:"<<s;
// int id = ms->GetSymbolAt(0)->GetID();
// QString name = Translator::UGStr2QStr(ms->GetSymbolAt(0)->GetName());
// qDebug()<<"****************:";
/*
qDebug()<<"****************:" <<QDir("./").absolutePath();
UGDatasetVector* dv = (UGDatasetVector*) m_pWorkspace->GetDataSource(0)->GetDataset(line3DSetAlias).get();
dv->Open();
GeoFeatureOperator geoFtOpt;
UGRecordsetPtr res = geoFtOpt.queryFeature(dv);
res->MoveLast();
UGGeometry* pGeometry = NULL;
res->GetGeometry(pGeometry);
UGGeoLine3D* l = (UGGeoLine3D*)pGeometry;
const UGPoint3D* p = NULL;
p = l->GetPoints();
for(int i =0;i<pGeometry->GetSubPntCount(0);i++)
{
qDebug()<<"****************x:"<<p->x;
qDebug()<<"****************y:"<<p->y;
qDebug()<<"****************z:"<<p->z;
qDebug()<<"*********************";
p++;
}
*/
}
MainWindow::~MainWindow()
{
delete ui;
}
//界面构建函数
void MainWindow::setupUI(QMainWindow *mainWindow)
{
//设置应用程序界面窗体的显示标题和窗体大小
mainWindow->setWindowTitle(tr("MapDisplay"));
mainWindow->resize(1600,1200);
stackedWidget = new QStackedWidget;
//将地图窗口置于应用程序窗体的中央
mainWindow->setCentralWidget(stackedWidget);
//工作空间初始化
initWorkSpace();
//二维地图容器初始化
initMapControl();
//添加到切换容器中
stackedWidget->addWidget(qMapControl);
stackedWidget->setCurrentIndex(0);
pSceneView = NULL;
mapType = MapType::Map2D;
//初始化菜单
initMenu(mainWindow);
//向应用程序窗体中添加工具条对象
mainToolBar = new QToolBar(mainWindow);
mainWindow->addToolBar(Qt::TopToolBarArea,mainToolBar);
//调用addMapAction函数向界面中添加功能按钮
addMapAction(mainWindow);
}
//工作空间初始化
void MainWindow::initWorkSpace()
{
//存储在程序所在路径下的MapData文件夹下
QString workspacePath = (QDir::currentPath() + "/MapData/");
DirExist(workspacePath);//判断文件夹是否存在,不存在则创建
//初始化工作空间
m_pWorkspace = new UGWorkspace();
wsFullName = workspacePath + wsName + ".smwu"; //工作空间存储路径
routeFullName = workspacePath + routeName + ".udbx"; //航线数据存储路径
//工作空间连接信息,用于工作空间的保存
UGWorkspaceConnection wkCon;
wkCon.m_strServer = Translator::QStr2UGStr(wsFullName);
wkCon.m_nWorkspaceType = UGWorkspace::UGWorkspaceType::WS_Version_SMWU;
wkCon.m_nVersion = m_pWorkspace->GetVersion();
MapDataManeger mapDataManeger;
if(!QFile::exists(wsFullName))
{//不存在工作空间,则新建一个工作空间
//初始化工作空间,并保存
m_pWorkspace->SetName(Translator::QStr2UGStr(wsName));
UGbool bSuc = m_pWorkspace->SaveAs(wkCon); //工作空间另存为
// mapDataManeger.saveWorkSpace(m_pWorkspace,Translator::QStr2UGStr(wsFullName)); //保存工作空间
}
//打开工作空间
m_pWorkspace->Open(Translator::QStr2UGStr(wsFullName));
m_pWorkspace->m_WorkspaceConnection = wkCon;
/**************************Map2D**************************/
if(!m_pWorkspace->m_DataSources.IsAliasExisted(Translator::QStr2UGStr(routeName)))
{//工作空间中无Route数据源则新建数据源
//创建存储航线等矢量数据的数据源
UGDataSource* pDataSource = mapDataManeger.createDataSource(routeName,UGEngineType::Spatialite,workspacePath);
/*************************Map2D*************************/
#pragma region{
//创建点数据集
UGDatasetVectorPtr pointDsv = mapDataManeger.createVectorSet(pDataSource,UGDataset::Point,pointSetAlias);
//添加字段
pointDsv->CreateField(_U("MarkID"),UGFieldInfo::INT32,4,0);
pointDsv->CreateField(_U("MarkName"),UGFieldInfo::Text,255,0);
//创建线数据集
UGDatasetVectorPtr lineDsv = mapDataManeger.createVectorSet(pDataSource,UGDataset::Line,lineSetAlias); //创建线数据集
//添加字段
lineDsv->CreateField(_U("RouteID"),UGFieldInfo::INT32,4,0);
lineDsv->CreateField(_U("RouteNumber"),UGFieldInfo::INT32,4,0); //航线编号
lineDsv->CreateField(_U("RouteType"),UGFieldInfo::INT32,4,0); //航线类型
lineDsv->CreateField(_U("RouteHeight"),UGFieldInfo::Float,4,0); //航线高度
lineDsv->CreateField(_U("RouteName"),UGFieldInfo::Text,255,0); //航线名字
lineDsv->CreateField(_U("IsClosedRoute"),UGFieldInfo::INT32,4,0); //是否自闭合
//创建面数据集
UGDatasetVectorPtr polygonDsv = mapDataManeger.createVectorSet(pDataSource,UGDataset::Region,polygonSetAlias); //创建面数据集
//添加字段
polygonDsv->CreateField(_U("GeofencingID"),UGFieldInfo::INT32,4,0);
polygonDsv->CreateField(_U("GeofencingName"),UGFieldInfo::Text,255,0);
// //创建节点标签数据集
// UGDatasetVectorPtr NodeDsv = mapDataManeger.createVectorSet(pDataSource,UGDataset::Text,NodeLabelSetAlias); //创建节点标签数据集
// //添加字段
// NodeDsv->CreateField(_U("NodeID"),UGFieldInfo::INT32,4);
// NodeDsv->CreateField(_U("RouteID"),UGFieldInfo::INT32,4);
// NodeDsv->CreateField(_U("GeofencingID"),UGFieldInfo::INT32,4);
// NodeDsv->CreateField(_U("NodeLabel"),UGFieldInfo::Text,255);
#pragma endregion}
/*************************Map3D*************************/
#pragma region{
//创建3D线数据集
UGDatasetVectorPtr line3DDsv = mapDataManeger.createVectorSet(pDataSource,UGDataset::LineZ,line3DSetAlias); //创建线数据集
//添加字段
line3DDsv->CreateField(_U("RouteID"),UGFieldInfo::INT32,4,0);
line3DDsv->CreateField(_U("RouteNumber"),UGFieldInfo::INT32,4,0); //航线编号
line3DDsv->CreateField(_U("RouteType"),UGFieldInfo::INT32,4,0); //航线类型
// line3DDsv->CreateField(_U("RouteHeight"),UGFieldInfo::Float,4,0); //航线高度
line3DDsv->CreateField(_U("RouteName"),UGFieldInfo::Text,255,0); //航线名字
line3DDsv->CreateField(_U("IsClosedRoute"),UGFieldInfo::INT32,4,0); //是否自闭合
#pragma endregion}
//往工作空间中添加数据源
m_pWorkspace->m_DataSources.Insert(Translator::QStr2UGStr(routeName),pDataSource);
//保存工作空间
m_pWorkspace->m_WorkspaceConnection.m_bFailIfExists = false;//调用save前要设置
UGbool ss = m_pWorkspace->Save();
pDataSource = NULL;
}
// for (int i=0;i<m_pWorkspace->m_DataSources.GetCount();i++)
// {
// qDebug()<<"DataSourceName:"<<Translator::UGStr2QStr(m_pWorkspace->m_DataSources.m_strArrNames[i]);
// }
}
//二维地图容器初始化
void MainWindow::initMapControl()
{
//实例化一个地图窗口对象即QMapControl对象
qMapControl = new QMapControl;
qMapControl->GetUGMapWnd()->SetAfterGeometryAddedFunc(AfterGeometryAddedCallback,(UGlong)qMapControl);
qMapControl->GetUGMapWnd()->SetAfterPointInputFunc(AfterPointInputCallback,(UGlong)qMapControl);
qMapControl->GetUGMapWnd()->SetGeometrySelectedFunc(GeometrySelectedCallback,(UGlong)qMapControl);
// qMapControl->GetUGMapWnd()->SetSingleGeometrySelectedFunc(SingleGeometrySelectedCallback,(UGlong)qMapControl);
// qMapControl->GetUGMapWnd()->SetTrackedFunc(TrackedProcCallback,(UGlong)qMapControl);
// qMapControl->GetUGMapWnd()->SetBeforeGeometryDeletedFunc(BeforeGeometryDeletedProcCallback,(UGlong)qMapControl);
// qMapControl->GetUGMapWnd()->SetAfterGeometryDeletedFunc(AfterGeometryDeletedProcCallback,(UGlong)qMapControl);
// qMapControl->GetUGMapWnd()->SetEditHandleCanceledFunc(EditHandleCanceledProcCallback,(UGlong)qMapControl);
// qMapControl->GetUGMapWnd()->SetBeginEditHandleFunc(BeginEditHandleProcCallback,(UGlong)qMapControl);
// qMapControl->GetUGMapWnd()->SetAfterGeometryModifiedFunc(AfterGeometryModifiedProcCallback,(UGlong)qMapControl);
// qMapControl->GetUGMapWnd()->SetBeforeGeometryModifiedFunc(BeforeGeometryModifiedProcCallback,(UGlong)qMapControl);
qMapControl->setFocus();
}
//菜单初始化
void MainWindow::initMenu(QMainWindow* mainWindow)
{
//保存航线ui
saveRouteDlg = new saveRouteDialog;
/****************************Map右键菜单**************************************/
//添加地图右键菜单对象
mapRBtnMenu = new QMenu(mainWindow);
// 属性右键菜单
attributeRBtnMenu = new QMenu(mainWindow);
// 添加菜单QAction
addMapMenuAction();
rMenuType = RBtnMenuType::DefaultMenu;
inputPosDlg = new ComputeOffsetPositionDialog;
}
//添加QAction
void MainWindow::addMapAction(QMainWindow *mainWindow)
{
//为"打开工作空间中地图"按钮添加按钮图标并将其置于工具条上
actionOpen = new QAction(QIcon(":/Resources/Image_Open.png"),"Open", this);
mainToolBar->addAction(actionOpen);
//为"全幅显示地图"按钮添加按钮图标并将其置于工具条上
actionViewEntire = new QAction(QIcon(":/Resources/Entire.png"),"View Entire",this);
mainToolBar->addAction(actionViewEntire);
//为"放大地图"按钮添加按钮图标并将其置于工具条上
actionZoomin = new QAction(QIcon(":/Resources/Zoomin.png"),"Zoom In",this);
mainToolBar->addAction(actionZoomin);
//为"缩小地图"按钮添加按钮图标并将其置于工具条上
actionZoomout = new QAction(QIcon(":/Resources/Zoomout.png"),"Zoom Out",this);
mainToolBar->addAction(actionZoomout);
//为"平移浏览地图"按钮添加按钮图标并将其置于工具条上
actionPan = new QAction(QIcon(":/Resources/Pan.png"),"Pan",this);
mainToolBar->addAction(actionPan);
//为"距离量算"按钮添加按钮图标并将其置于工具条上
actionCalcLength = new QAction(QIcon(":/Resources/Length.png"),"length",this);
mainToolBar->addAction(actionCalcLength);
//为"面积量算"按钮添加按钮图标并将其置于工具条上
actionCalcArea = new QAction(QIcon(":/Resources/Area.png"),"Area",this);
mainToolBar->addAction(actionCalcArea);
//为"角度量算"按钮添加按钮图标并将其置于工具条上
actionCalcAngle = new QAction(QIcon(":/Resources/Angle.png"),"angle",this);
mainToolBar->addAction(actionCalcAngle);
//为"选择"按钮添加按钮图标并将其置于工具条上
actionSelect = new QAction(QIcon(":/Resources/Select.png"),"Select",this);
mainToolBar->addAction(actionSelect);
//为"绘制点"按钮添加按钮图标并将其置于工具条上
actionDrawPoint = new QAction(QIcon(":/Resources/Image_Point.png"),"DrawPoint",this);
mainToolBar->addAction(actionDrawPoint);
//为"绘制线"按钮添加按钮图标并将其置于工具条上
actionDrawLine = new QAction(QIcon(":/Resources/Image_Line.png"),"DrawLine",this);
mainToolBar->addAction(actionDrawLine);
//为"绘制多边形"按钮添加按钮图标并将其置于工具条上
actionDrawPolygon = new QAction(QIcon(":/Resources/Image_Polygon.png"),"DrawPolygon",this);
mainToolBar->addAction(actionDrawPolygon);
//绘制要素时手动输入点触发按钮
actionInputPoint = new QAction(QIcon(":/Resources/InputPoint.png"),"InputPoint",this);
mainToolBar->addAction(actionInputPoint);
//绘制在线地图按钮
actionOnlineMap = new QAction(QIcon(":/Resources/OnlineMap.png"),"OnlineMap",this);
mainToolBar->addAction(actionOnlineMap);
//绘制地图定位按钮
actionMapLocation = new QAction(QIcon(":/Resources/MapLocation.png"),"地图定位",this);
mainToolBar->addAction(actionMapLocation);
//绘制二三维地图切换按钮
actionTransformMap = new QAction(QIcon(":/Resources/view_3d.png"),"3D地图",this);
mainToolBar->addAction(actionTransformMap);
//绘制导入数据按钮
actionImportData = new QAction(QIcon(":/Resources/import_data.png"),"导入数据",this);
mainToolBar->addAction(actionImportData);
}
//添加地图右键菜单QAction
void MainWindow::addMapMenuAction()
{
// 地图右键菜单QAction
actionImportRoute = mapRBtnMenu->addAction(u8"导入航线");
actionShowRoute = mapRBtnMenu->addAction(u8"显示航线");
actionBindRoute = mapRBtnMenu->addAction(u8"装订航线");
//属性右键菜单QAction
actionAttribute = attributeRBtnMenu->addAction("属性");
actionExportFile = attributeRBtnMenu->addAction("导出");
}
//Map连接信号和槽的函数
void MainWindow::addMapConnect()
{
connect(qMapControl,&QMapControl::sendPreviousPoint,inputPosDlg,&ComputeOffsetPositionDialog::acceptPresiousPoint);
connect(inputPosDlg,&ComputeOffsetPositionDialog::sendComputedPoint,qMapControl,&QMapControl::clickedComputedPoint);
//连接信号actionOpen和槽openMap
connect(actionOpen,&QAction::triggered,this,&MainWindow::openRasterMap);
//连接信号actionViewEntire和槽viewEntire
connect(actionViewEntire,&QAction::triggered,this,&MainWindow::viewEntire);
//连接信号actionZoomin和槽zoomIn
connect(actionZoomin,&QAction::triggered,this,&MainWindow::zoomIn);
//连接信号actionZoomout和槽zoomOut
connect(actionZoomout,&QAction::triggered,this,&MainWindow::zoomOut);
//连接信号actionPan和槽pan
connect(actionPan,&QAction::triggered,this,&MainWindow::pan);
//连接信号actionCalcLength和槽calcLength
connect(actionCalcLength,&QAction::triggered,this,&MainWindow::calcLength);
//连接信号actionCalcArea和槽calcArea
connect(actionCalcArea,&QAction::triggered,this,&MainWindow::calcArea);
//连接信号actionCalcAngle和槽calcAngle
connect(actionCalcAngle,&QAction::triggered,this,&MainWindow::calcAngle);
//连接信号actionSelect和槽Select
connect(actionSelect,&QAction::triggered,this,&MainWindow::Select);
//连接信号actionDrawPoint和槽drawPoint
connect(actionDrawPoint,&QAction::triggered,this,&MainWindow::drawPoint);
//连接信号actionDrawLine和槽drawLine
connect(actionDrawLine,&QAction::triggered,this,&MainWindow::drawLine);
//连接信号actionDrawPolygon和槽drawPolygon
connect(actionDrawPolygon,&QAction::triggered,this,&MainWindow::drawPolygon);
//连接信号actionInputPoint和槽showComputeOffsetPosition
connect(actionInputPoint,&QAction::triggered,this,&MainWindow::showComputeOffsetPosition);
//连接信号actionOnlineMap和槽showOnlineMapDialog
connect(actionOnlineMap,&QAction::triggered,this,&MainWindow::showOnlineMapDialog);
//连接信号actionOnlineMap与地图定位弹窗
connect(actionMapLocation,&QAction::triggered,this,[=](){
MapLocationDialog mapLocationDlg;
if(mapType==MapType::Map2D)
mapLocationDlg.setMap(qMapControl->GetUGMapWnd());
else
mapLocationDlg.setScene(pSceneControl);
mapLocationDlg.exec();
});
//连接信号actionTransformMap与槽transformMap
connect(actionTransformMap,&QAction::triggered,this,&MainWindow::transformMap);
//连接信号actionTransformMap与ImportSceneDataDialog对话框
connect(actionImportData,&QAction::triggered,this,[&](){
ImportSceneDataDialog importSceneDataDlg;
connect(&importSceneDataDlg,&ImportSceneDataDialog::sendSceneDataPath,this,&MainWindow::importSceneData);
importSceneDataDlg.exec();
});
/********************右键菜单信号槽连接********************/
//连接信号actionBindRoute和槽showBindRouteDialog
connect(actionBindRoute,&QAction::triggered,this,&MainWindow::showBindRouteDialog);
// 连接信号actionShowRoute和槽DisplayRouteDialog
connect(actionShowRoute,&QAction::triggered,this,[=](){
//获取线数据集
UGDatasetPtr Route_ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName))->GetDataset(lineSetAlias);
Route_ds->Open();
DisplayRouteDialog displayRouteDlg;
displayRouteDlg.setDataset(Route_ds);
displayRouteDlg.setMapEditorWnd(qMapControl->GetUGMapWnd());
displayRouteDlg.addRouteTypeItem();
displayRouteDlg.exec();
Route_ds = NULL;
});
// 连接信号actionImportRoute和槽导入
connect(actionImportRoute,&QAction::triggered,this,[=](){
importKMLData();
});
/********************属性右键菜单信号槽连接********************/
connect(qMapControl,&QMapControl::showAttributeMenu,this,&MainWindow::showAttributeMenu);
}
//三维场景容器初始化
void MainWindow::initSceneControl(QWidget* parent)
{
pSceneView = new SceneView();
pSceneView->setAttribute(Qt::WA_DeleteOnClose); // 关闭后就释放
pSceneView->resize(parent->width(),parent->height());
// pSceneView->setFocus();
pSceneControl = pSceneView->GetSceneControl();
pSceneControl->SetWorkspace(new Workspace(m_pWorkspace));
//添加场景右键菜单对象
initSceneMene();
//添加信号连接
addSceneConnect();
addSceneActionConnect();
}
//三维场景菜单初始化
void MainWindow::initSceneMene()
{
//添加场景右键菜单对象
sceneRBtnMenu = new QMenu(this);
addSceneMenuAction();
rMenuType = RBtnMenuType::DefaultMenu;
}
//添加场景右键菜单QAction
void MainWindow::addSceneMenuAction()
{
// 场景右键菜单QAction
actionSceneImportRoute = sceneRBtnMenu->addAction(u8"导入航线");
actionSceneShowRoute = sceneRBtnMenu->addAction(u8"显示航线");
actionSceneBindRoute = sceneRBtnMenu->addAction(u8"装订航线");
}
//Scene QAction连接信号和槽的函数
void MainWindow::addSceneActionConnect()
{
/********************场景右键菜单信号槽连接********************/
//连接信号actionBindRoute和槽showBindRouteDialog
connect(actionSceneBindRoute,&QAction::triggered,this,&MainWindow::showBindRouteDialog);
// 连接信号actionShowRoute和槽DisplayRouteDialog
connect(actionSceneShowRoute,&QAction::triggered,this,[=](){
//获取线数据集
UGDatasetPtr Route3D_ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName))->GetDataset(line3DSetAlias);
Route3D_ds->Open();
DisplayRouteDialog displayRouteDlg;
displayRouteDlg.setDataset(Route3D_ds);
displayRouteDlg.setSceneControl(pSceneControl);
displayRouteDlg.addRouteTypeItem();
displayRouteDlg.exec();
Route3D_ds = NULL;
});
// 连接信号actionImportRoute和槽导入
connect(actionSceneImportRoute,&QAction::triggered,this,[=](){
importKML3DData();
});
/********************场景右键属性菜单信号槽连接********************/
//连接actionExportFile与KML导出函数
connect(actionExportFile,&QAction::triggered,this,&MainWindow::exportKMLFile);
}
//Scene连接信号和槽的函数
void MainWindow::addSceneConnect()
{
// connect(pSceneView,&SceneView::sendTrackedGeometry,this,&MainWindow::showSaveRoute3DDialog);
connect(pSceneView,&SceneView::showSettingFlightPointDialg,this,&MainWindow::showSettingFlightPoint3DDialog);
//连接右键属性菜单信号
connect(pSceneView,&SceneView::showAttributeMenu,this,&MainWindow::showAttributeMenu);
}
//判断文件夹是否存在
UGbool MainWindow::DirExist(QString fullPath)
{
QDir dir(fullPath);
if(dir.exists())
{
//存在文件夹
return true;
}
else
{
//不存在则创建
bool ok = dir.mkdir(fullPath); //只创建一级子目录,即必须保证上级目录存在
//bool ok = dir.mkpath(fullPath);//不存在当前目录,创建,可创建多级目录
return ok;
}
}
// 导入KML/KMZ文件
void MainWindow::importKMLData()
{
//获取文件路径
QString qStrPath = QFileDialog::getOpenFileName(this,"导入KML/KMZ文件",
":/supermap-iobjectscpp/MyProject/MapDisplay/SampleData/",
"Google KML(*.kml *.kmz)");
if(qStrPath.isEmpty())
{
return;
}
//获取数据源
UGDataSource* pDataSource = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
if(pDataSource==NULL) return;
//打开KML文件
UGString dtName = pDataSource->GetUnoccupiedDatasetName(_U("KML"));//导入数据集名称
GeoFileParser GeoFP;
bool issucceed = GeoFP.importKMLData(pDataSource,dtName,qStrPath);
if(issucceed)
{
UGDatasetPtr kmlDt = pDataSource->GetDataset(dtName);
UGDatasetVector* kmlDv = (UGDatasetVector*) kmlDt.get();
if(!kmlDv->IsOpen()) kmlDv->Open();
GeoFeatureOperator geoFtOperator;
UGRecordsetPtr kmlRes = geoFtOperator.queryFeature(kmlDv);
LayerOperator layerOperator;
RouteGlobalVariant routeGVar;
UGStyle sty;
routeGVar.getTemporaryStyle(sty);
// if(mapType==MapType::Map2D)
// layerOperator.showKMLTemporary(qMapControl,kmlRes);
//将kml航线临时展示在动态图层
UGMap* pMap = qMapControl->GetMap();
UGDynamicLayer* pDyLayer = NULL;
UGString kmlLayerName = _U("KMLDyLayer");
layerOperator.getDynamicLayer(pMap,pDyLayer,kmlLayerName);
layerOperator.addGeometryInDynamicLayer(pDyLayer,kmlRes,sty);
//设置第一条航线高亮
routeGVar.getHighLightStyle(sty);
pDyLayer->GetAt(0)->SetStyle(&sty);
pMap->m_DynamicLayers.Add(pDyLayer);
qMapControl->Refresh();
//航线属性信息导入
kmlRes->MoveFirst();
UGDatasetVector* dstDV = (UGDatasetVector*)pDataSource->GetDataset(lineSetAlias).get();
if(!dstDV->IsOpen()) dstDV->Open();
UGGeometry* pGeometry = NULL;
QMap<QString,QString> fieldsValue;
//连接航线导入状态信号
connect(this,&MainWindow::sendAddRouteState,saveRouteDlg,&saveRouteDialog::getAddRouteState);
//连接航线导入信号
connect(saveRouteDlg,&saveRouteDialog::importRoute,this,[&](int routeID,int routeType,int routeNumber,double routeHeight,int routeClosedState){
//移动指针到当前航线
kmlRes->MoveTo(routeID-1);
//提取航线属性信息
GeoFeatureOperator geoFtOperator;
fieldsValue.insert(routeGVar.routeFieldsName.RouteID,QString::number(dstDV->GetObjectCount()+1));
fieldsValue.insert(routeGVar.routeFieldsName.RouteHeight,QString::number(routeHeight));
fieldsValue.insert(routeGVar.routeFieldsName.RouteNumber,QString::number(routeNumber));
fieldsValue.insert(routeGVar.routeFieldsName.RouteType,QString::number(routeType));
fieldsValue.insert(routeGVar.routeFieldsName.IsClosedRoute,QString::number(routeClosedState));
//导入数据集
kmlRes->GetGeometry(pGeometry);
int ss = geoFtOperator.importFeatureAttribute(dstDV,pGeometry,fieldsValue);
emit sendAddRouteState(ss);
//qDebug()<<"*******************RecordCount:"<<dstDV->GetObjectCount();
// kmlRes->MoveNext();
pGeometry = NULL;
kmlDv = NULL;
});
//高亮当前要导入的航线
connect(saveRouteDlg,&saveRouteDialog::highLightGeometry,this,[&](int currentGeometryID,int lastGeometryID){
// UGDynamicLayer* pDyLayer = qMapControl->GetMap()->m_DynamicLayers.GetDynamicLayer(kmlLayerName);
//取消原高亮几何对象
routeGVar.getTemporaryStyle(sty);
pDyLayer->GetAt(lastGeometryID-1)->SetStyle(&sty);
// 高亮新几何对象
routeGVar.getHighLightStyle(sty);
pDyLayer->GetAt(currentGeometryID-1)->SetStyle(&sty);
qMapControl->Refresh();
});
//显示弹窗
saveRouteDlg->setMaxValue(kmlRes->GetRecordCount());
int ret = saveRouteDlg->exec();
//清除数据集和临时航线图层
pDataSource->DeleteDataset(dtName);
pDyLayer->RemoveAll();
qMapControl->Refresh();
pDyLayer = NULL;
pDataSource = NULL;
}
}
//导入三维KML数据
void MainWindow::importKML3DData()
{
//获取文件路径
QString qStrPath = QFileDialog::getOpenFileName(this,"导入KML/KMZ文件",
":/supermap-iobjectscpp/MyProject/MapDisplay/SampleData/",
"Google KML(*.kml *.kmz)");
if(qStrPath.isEmpty())
{
return;
}
//获取数据源
UGDataSource* pDataSource = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
if(pDataSource==NULL) return;
//打开KML文件
UGString dtName = pDataSource->GetUnoccupiedDatasetName(_U("KML3D"));//导入数据集名称
GeoFileParser GeoFP;
bool issucceed = GeoFP.importKMLData(pDataSource,dtName,qStrPath);
if(issucceed)
{
UGDatasetPtr kmlDt = pDataSource->GetDataset(dtName);
UGDatasetVector* kmlDv = (UGDatasetVector*) kmlDt.get();
if(!kmlDv->IsOpen()) kmlDv->Open();
GeoFeatureOperator geoFtOperator;
UGRecordsetPtr kml3DRes = geoFtOperator.queryFeature(kmlDv);
LayerOperator layerOperator;
RouteGlobalVariant routeGVar;
UGStyle3D defaultStyle;
UGStyle3D highLightStyle;
routeGVar.getTemporaryStyle3D(defaultStyle);
routeGVar.getHighLightStyle3D(highLightStyle);
// sty.SetAltitudeMode(AltitudeMode::Absolute);
UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D();
//添加到追踪层
// layerOperator.addGeometryToTrackingLayer3D(pSceneControl,kml3DRes);
//设置第一条航线高亮
UGGeoLine3D* line3D = NULL;
UGGeometry* pGeometry = NULL;
UGVariant v;
UGVariant v1;
UGString tag;
kml3DRes->MoveFirst();
kml3DRes->GetGeometry(pGeometry);
kml3DRes->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteType),v);
kml3DRes->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteNumber),v1);
tag = v.ToString() + _U("_") + v1.ToString();
line3D = (UGGeoLine3D*)pGeometry;
line3D->SetStyle3D(&highLightStyle);
trackingLayer3D->Add(line3D,tag);
//设置第一条航线高亮
// routeGVar.getHighLightStyle3D(sty);
// trackingLayer3D->GetAt(0)->SetStyle3D(&highLightStyle);
// UGStyle3D* sty = trackingLayer3D->GetAt(1)->GetStyle3D();
// trackingLayer3D->GetAt(0)->GetStyle3D()->SetLineColor3D(highLightStyle.GetLineColor3D());
// routeGVar.getTemporaryStyle3D(sty);
// trackingLayer3D->GetAt(0)->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D());
// routeGVar.getHighLightStyle3D(sty);
// trackingLayer3D->GetAt(1)->SetStyle3D(&sty);
// trackingLayer3D->GetAt(1)->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D());
// routeGVar.getTemporaryStyle3D(sty);
// trackingLayer3D->GetAt(1)->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D());
// routeGVar.getHighLightStyle3D(sty);
// trackingLayer3D->GetAt(1)->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D());
// trackingLayer3D->SetRefresh(false);
//航线属性信息导入
kml3DRes->MoveFirst();
UGDatasetVector* dstDV = (UGDatasetVector*)pDataSource->GetDataset(line3DSetAlias).get();
if(!dstDV->IsOpen()) dstDV->Open();
// UGGeometry* pGeometry = NULL;
QMap<QString,QString> fieldsValue;
saveRouteDialog* saveKMLDlg = new saveRouteDialog();
saveKMLDlg->setHeightVisible(false);
//连接航线导入状态信号
connect(this,&MainWindow::sendAddRouteState,saveKMLDlg,&saveRouteDialog::getAddRouteState,Qt::UniqueConnection);
//连接航线导入信号
connect(saveKMLDlg,&saveRouteDialog::importRoute,this,[&](int routeID,int routeType,int routeNumber,double routeHeight,int routeClosedState){
//移动指针到当前航线
kml3DRes->MoveTo(routeID-1);
//提取航线属性信息
GeoFeatureOperator geoFtOperator;
fieldsValue.insert(routeGVar.routeFieldsName.RouteID,QString::number(dstDV->GetObjectCount()+1));
fieldsValue.insert(routeGVar.routeFieldsName.RouteHeight,QString::number(routeHeight));
fieldsValue.insert(routeGVar.routeFieldsName.RouteNumber,QString::number(routeNumber));
fieldsValue.insert(routeGVar.routeFieldsName.RouteType,QString::number(routeType));
fieldsValue.insert(routeGVar.routeFieldsName.IsClosedRoute,QString::number(routeClosedState));
//导入数据集
kml3DRes->GetGeometry(pGeometry);
int ss = geoFtOperator.importFeatureAttribute(dstDV,pGeometry,fieldsValue);
emit sendAddRouteState(ss);
//qDebug()<<"*******************RecordCount:"<<dstDV->GetObjectCount();
// kmlRes->MoveNext();
pGeometry = NULL;
kmlDv = NULL;
});
//高亮当前要导入的航线
connect(saveKMLDlg,&saveRouteDialog::highLightGeometry,this,[&](int currentGeometryID,int lastGeometryID){
// qDebug()<<"********************currentGeometryID:"<<currentGeometryID;
// qDebug()<<"********************lastGeometryID:"<<lastGeometryID;
// qDebug()<<"***********************Count:"<<trackingLayer3D->GetCount();
trackingLayer3D->RemoveAll();
line3D = NULL;
pGeometry = NULL;
// trackingLayer3D->RemoveAt(currentGeometryID-1);
kml3DRes->MoveTo(currentGeometryID-1);
kml3DRes->GetGeometry(pGeometry);
line3D = (UGGeoLine3D*)pGeometry;
line3D->SetStyle3D(&highLightStyle);
kml3DRes->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteType),v);
kml3DRes->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteNumber),v1);
tag = v.ToString() + _U("_") + v1.ToString();
trackingLayer3D->Add(line3D,tag);
});
//connect(saveKMLDlg,&saveRouteDialog::highLightGeometry,this,&MainWindow::highLightKMLGeometry);
//显示弹窗
saveKMLDlg->setMaxValue(kml3DRes->GetRecordCount());
int ret = saveKMLDlg->exec();
// saveKMLDlg->show();
//清除数据集和临时航线图层
pDataSource->DeleteDataset(dtName);
trackingLayer3D->RemoveAll();
// trackingLayer3D->SetRefresh(false);
// routeGVar.getHighLightStyle3D(sty);
// trackingLayer3D->GetAt(0)->SetStyle3D(&sty);
// routeGVar.getTemporaryStyle3D(sty);
// trackingLayer3D->GetAt(0)->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D());
// trackingLayer3D->GetAt(0)->SetStyle3D(&sty);
// routeGVar.getHighLightStyle3D(sty);
// trackingLayer3D->GetAt(1)->SetStyle3D(&sty);
// trackingLayer3D->GetAt(1)->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D());
// pSceneControl->GetScene3D()->UpdateData();
// pSceneControl->GetScene3D()->Refresh();
// pSceneControl->Refresh();
// pDataSource->DeleteDataset(dtName);
delete saveKMLDlg;
pDataSource = NULL;
}
}
//导出KML文件
void MainWindow::exportKMLFile()
{
QString savePath = QFileDialog::getSaveFileName(this, tr("导出KML文件"),
"/航线1",
tr("Google KML(*.kml);;Google KML(*.kmz)"));
// qDebug()<<"*********************************导出被调用了!";
if(savePath.isEmpty()) return;
LayerOperator layerOpt;
QMap<int,QStringList> featureInfo;
if(mapType==MapType::Map2D)
featureInfo = layerOpt.getSelectedFeature(qMapControl->GetMap());
else if(mapType==MapType::Map3D)
featureInfo = layerOpt.getSelectedFeature3D(pSceneControl);
//构造SQL查询条件
QStringList filterlist;
QList<int> types = featureInfo.keys();
for(int i = 0; i < types.size(); i++)
{
filterlist<< "(RouteNumber in (" + featureInfo[types[i]].join(",") + ") and " + "RouteType = " + QString::number(types[i]) + ")";
}
QString filter = filterlist.join(" or ");
// 导出
UGDataSource* ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
if(!ds->IsOpen()) ds->Open();
GeoFileParser GeoFP;
RouteGlobalVariant routeGVar;
if(mapType==MapType::Map2D)
GeoFP.exportKMLData(ds,Translator::UGStr2QStr(routeGVar.workspaceDataName.LineDatasetName),savePath,filter);
else if(mapType==MapType::Map3D)
GeoFP.exportKMLData(ds,Translator::UGStr2QStr(routeGVar.workspaceDataName.Line3DDatasetName),savePath,filter);
ds = NULL;
}
//加载三维模型数据
void MainWindow::loadModelData()
{
//获取数据源
UGDataSource* pDataSource = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
if(pDataSource==NULL) return;
if(!pDataSource->IsOpen()) pDataSource->Open();
QString path = "D:/supermap-iobjectscpp/MyProject/MapDisplay/ModelData/plane.3ds";
QString path1 = "D:/supermap-iobjectscpp/MyProject/MapDisplay/ModelData/xiaofangche.s3m";
QString kmlpath = "E:/a.kml";
// QString path = "D:/supermap-iobjectscpp/MyProject/MapDisplay/ModelData/xiaofangche.gltf";
// GeoFileParser geoFileParser;
// if(pDataSource->GetDataset(_U("Plane"))==NULL)
// {
// bool ss = geoFileParser.importModelData(pDataSource,_U("Plane"),path);
// if(!ss) return;
// }
/*
UGFlyRoute* flyRoute = new UGFlyRoute();
UGFlyRouteStop* stop1 = new UGFlyRouteStop();
UGPoint3D point3D(119.723971,32.220508,30);
stop1->FromPoint3D(point3D,0);
UGCameraState cs1;
cs1.dTilt = UGMathEngine::Degree2Radian(70);
// stop1->SetCamera(&cs1);
UGFlyRouteStop* stop2 = new UGFlyRouteStop();
UGPoint3D point3D2(119.725471,32.216129,30);
stop2->FromPoint3D(point3D2,1);
// stop2->SetCamera(&cs1);
UGFlyRouteStop* stop3 = new UGFlyRouteStop();
UGPoint3D point3D3(119.723971,32.210508,30);
stop3->FromPoint3D(point3D3,2);
// stop3->SetCamera(&cs1);
flyRoute->m_pRouteStops->Insert(0,stop1);
flyRoute->m_pRouteStops->Insert(1,stop2);
flyRoute->m_pRouteStops->Insert(2,stop3);
qDebug()<<"*****************StopCounts:"<<flyRoute->m_pRouteStops->GetCount();
UGFlyManager* flymag = new UGFlyManager();
UGFlyRoutes* flyRoutes = flymag->GetRoutes();
flyRoute->SetStopsVisible(true);
flyRoute->SetLinesVisible(true);
flyRoute->SetSpeed(30);
flyRoutes->Add(flyRoute);
// pSceneControl->GetScene3D()->SetFlyManager(flymag);
flymag->SetScene(pSceneControl->GetScene3D());
// flymag->SetPlayRate(60);
// flymag->Update();
flymag->Play();
UGFlyRouteStop* stop4 = new UGFlyRouteStop();
UGPoint3D point3D4(119.723771,32.210208,30);
stop4->FromPoint3D(point3D4,3);
flymag->GetRoutes()->GetCurrentRoute()->m_pRouteStops->Add(stop4);
flymag->Update();
*/
// pSceneControl->GetCameraWorld()->SetEyeTilt((60/180)*PI);
// pSceneControl->GetCameraWorld()->Pitch(60/180*PI);
// UGCameraState cs;
// pSceneControl->GetCameraWorld()->GetLookAt(cs);
// double lat = cs.dLat;
// double lon = cs.dLon;
// double altitude = cs.dAltitude;
// double heading = cs.dHeading;
// double roll = cs.dRoll;
// double tilt = cs.dTilt;
// pSceneControl->GetCameraWorld()->Pan(-0.0001,0);
// UGCameraGlobal* cameraGb = (UGCameraGlobal*)pSceneControl->GetCameraWorld();
// UGCameraWorld* cameraGb = pSceneControl->GetCameraWorld();
// cameraGb->m_StateCamera.dTilt = 60/180*PI;
// cameraGb->Pitch(60/180*PI);
// cameraGb->PitchCamera(60/180*PI);
// cameraGb->UpdateViewRange();
// cameraGb->UpdateViewRange();
UGScene3D* scene = pSceneControl->GetScene3D();
// scene->SetTrackingLayerEditable(true);
// scene->SetStereoEnable(true);
// UGString datasetName = _U("Line3DTmp");
// UGLayer3Ds* layers = pSceneControl->GetUGLayer3Ds();
// UGLayer3D* lineLayer3D = pSceneControl->AddLayerFromDataset(pDataSource->GetAlias(),datasetName);
// qDebug()<<"*******************LayerCount1:"<<layers->GetInnerCount();
// lineLayer3D->SetSelectable(true);
// layers->SetEditableLayer(lineLayer3D,true); //设置图层可编辑
// UGStyle3D style3D;
//// style3D.SetAltitudeMode(AltitudeMode::Absolute);
// style3D.SetLineWidth(1);
// style3D.SetLineColor(UGRGB(255,0,0));
// lineLayer3D->SetStyle3D(style3D);
//// lineLayer3D->SetEditable(true);
//// qDebug()<<"*******************LayerEditable:"<<lineLayer3D->GetEditable();
// pSceneControl->GetSceneEditWnd()->SetUserAction(UGSceneUserAction::suaEdit,UGEditType3D::ET3D_PolyLine); //
//// pSceneControl->GetSceneEditWnd()->SetUserAction(UGEditType3D::ET3D_PolyLine,UGSceneUserAction::suaCreatePolyline);
// UGLayer3D* planeLayer = pSceneControl->GetUGLayer3Ds()->AddLayer(_U("Plane@Route")); //
// pSceneControl->ViewToLayer(planeLayer);
// UGCameraWorld* cameraGb = pSceneControl->GetCameraWorld();
// std::set< UGint > setObjsVisible;
// setObjsVisible.insert(0);
// planeLayer->SetObjsVisible(setObjsVisible,false);
// qDebug()<<"**************layersCount0:"<<layers->GetInnerCount();
// layers->ReleaseLayerState(planeLayer);
// layers->TreeRemoveAt(0);
// qDebug()<<"**************layersCount1:"<<layers->GetInnerCount();
// qDebug()<<"**************:"<<planeLayer->GetAttachData();
// UGStyle3D tmpSty = planeLayer->GetStyle3D();
// tmpSty.SetAltitudeMode(AltitudeMode::Absolute);
// planeLayer->SetVisible(false);
// layers->SetEditableLayer(planeLayer,true);
// planeLayer->SetSelectable(true);
// UGRenderObjectList* rof = planeLayer->GetRenderObjectList();
// UGRenderFeature* rf = planeLayer->GetRenderFeature(0);
// UGArray< UGRenderFeature* >* rfs = planeLayer->GetEditFeatures();
// UGSelection3D* st = planeLayer->GetSelection3D();
// qDebug()<<"**************SelectionSize:"<<st->GetSize();
// planeLayer->AddSelectedID(0);
// qDebug()<<"**************SelectionSize1:"<<st->GetSize();
// UGArray<UGRenderFeature*>* fts = planeLayer->GetarrSelection();
// int i = rfs->GetSize();
// qDebug()<<"**************ss";
// UGRenderFeature* rf = planeLayer->GetRenderFeature(0);
// rf->GetInestGeometry3D()->SetPosition(UGPoint3D(119.73,32.25,25));
// qDebug()<<"**************ss:"<<ss;
// pDataSource = NULL;
//模型移动测试
// UGDatasetVector* dv = (UGDatasetVector*)pDataSource->GetDataset(_U("Plane")).get(); //Plane
// ShowPlane3D* plane3D = new ShowPlane3D(pSceneControl,dv);
// plane3D->setPlanesCount(1);
// plane3D->startFly();
// if(!dv->IsOpen()) dv->Open();
// UGQueryDef query;
// UGRecordsetPtr res = dv->Query(query);
// res->MoveFirst();
// qDebug()<<"*****************RecordCount:"<<res->GetRecordCount();
// UGGeometry* geometry = NULL;
// res->GetGeometry(geometry); //geometryType: GeoModelPro
// qDebug()<<"*************geometryType:"<<geometry->GetType();
// UGRect2D rec = geometry->GetBounds();
// qDebug()<<"*************leftX:"<<rec.BottomLeft().x;
// qDebug()<<"*************rightX:"<<rec.BottomRight().x;
// qDebug()<<"*************BottomY:"<<rec.BottomLeft().y;
// qDebug()<<"*************TopY:"<<rec.TopLeft().y;
// qDebug()<<"*************Height:"<<rec.Height();
// UGGeometry3D* g3 = (UGGeometry3D*)geometry;
// pSceneControl->GetScene3D()->SetTrackingGeometry(g3);
// pSceneControl->GetScene3D()->SetTrackOffset(UGVector3d(0,0,100));
// g3->SetPosition(UGPoint3D(119.718414,32.234539,25));
// g3->Set3DPoint(UGPoint3D(119.718414,32.234539,25));
// UGPoint3D p3 = g3->GetPosition();
// qDebug()<<"*************x0:"<<p3.x;
// qDebug()<<"*************y0:"<<p3.y;
// qDebug()<<"*************z0:"<<p3.z;
// scene->GetCamera()
// UGCameraGlobal* cameraGb = (UGCameraGlobal*)pSceneControl->GetCameraWorld();
// pSceneControl->GetCameraWorld()->InteriaTracking();
// pSceneControl->GetCameraWorld()->SetTrackingOffset(UGVector3d(0,0,200));
// UGCameraState cs;
// cs.dLat = UGMathEngine::Degree2Radian(g3->GetPosition().y);
// cs.dLon = UGMathEngine::Degree2Radian(g3->GetPosition().x);
// cs.dAltitude = 100;
// cs.dTilt = UGMathEngine::Degree2Radian(80);
// cs.dHeading = 0;
// cs.nAltitudeMode = AltitudeMode::Absolute;
// cameraGb->SetCamera(cs);
// UGCameraWorld* cameraGb = pSceneControl->GetCameraWorld();
// cameraGb->Pitch(UGMathEngine::Degree2Radian(80));
// cameraGb->PitchCamera(UGMathEngine::Degree2Radian(80));
// pSceneControl->GetScene3D()->SetTrackingGeometry(g3);
// pSceneControl->GetScene3D()->SetTrackOffset(UGVector3d(0,0,100));
// cameraGb->UpdateTrackingCamera(g3);
// cameraGb->SetMinDistanceToModel(100);
// cameraGb->SetTrackingOffset(UGVector3d(0,0,100));
// cameraGb->SetEyeTilt(UGMathEngine::Degree2Radian(88));
// pSceneControl->GetCameraWorld()->FlyTo(geometry,100);
// cameraGb->FlyToCamera(cs,100);
// cameraGb->SetEyeTilt(UGMathEngine::Degree2Radian(80));
// cameraGb->SetCamera(cs);
// cameraGb->m_StateCamera.dTilt = UGMathEngine::Degree2Radian(80);
// cameraGb->Refresh();
//// qDebug()<<"********************Type:"<<geometry->GetType();
// res->Edit();
// UGGeoModelPro* model = (UGGeoModelPro*)geometry;
// model->SetPosition(UGPoint3D(119.73,32.234539,25));
// res->SetGeometry(*model);
// res->Update();
// model->SetStyle3D(&tmpSty);
// UGGeoModel* model = (UGGeoModel*)geometry;
// scene->SetTrackingGeometry(model);
// scene->SetTrackOffset(UGVector3d(119.73,32.234539,200));
// plane3D->startFly();
// UGGeoModel* model = new UGGeoModel();
// model->MakeWithGeometry(geometry);
// model->FromGeoModel(geometry);
// model->SetAttachedFilePath(Translator::QStr2UGStr(path1));
// model->SetFilePathName(Translator::QStr2UGStr(path1));
// bool s = model->IsValid();
// model->SetPosition(UGPoint3D(119.718414,32.234539,25));
UGStyle3D style3D;
// style3D.SetMarker3D(true);
// style3D.SetScaleBySymbol(true);
// style3D.SetFixedPixelSize(false);
style3D.SetFill3DMode(UGC::/*UGFill3DMode::*/FILL_FACE);
style3D.SetAltitudeMode(AltitudeMode::Absolute);
// style3D.SetLineWidth(1);
// style3D.SetLineColor(UGRGB(255,0,0));
// style3D.SetFillBackColor(UGRGB(255,0,0));
// style3D.SetFillForeColor(UGRGB(255,0,0));
// style3D.SetFillColor(UGRGB(255,0,0));
//// style3D.SetMarker3D(true);
// style3D.SetMarkerSize(1000);
// style3D.SetMarker3DScaleX(10);
// model->SetStyle3D(&style3D);
// geometry->SetStyle(&style3D);
//// geometry->Set3DPoint(UGPoint3D(119.718567,32.234317,20));
// planeLayer->SetStyle3D(style3D);
UGLayer3Ds* layers = pSceneControl->GetUGLayer3Ds();
// UGLayer3D* planeLayer = pSceneControl->GetUGLayer3Ds()->AddLayer(_U("Plane@Route")); //
// planeLayer->SetStyle3D(style3D);
UGLayer3DManager layer3DMag;
bool ls = layer3DMag.LoadLayer3D(_U("D:/supermap-iobjectscpp/bin/bin_x64/SuLayer3DTree.l3d"));
bool ls1 = layer3DMag.LoadLayer3D(_U("D:/supermap-iobjectscpp/bin/bin_x64/SuLayer3DFile.l3d"));
// UGLayer3D* planeLayer = layer3DMag.CreateLayer3D(UGLayer3DType::l3dDynamicModel);
// UGLayer3DDynamic* dyLayer3D = (UGLayer3DDynamic*)planeLayer;
// UGLayer3DDynamic* p_UGLayer3DDynamic = (UGLayer3DDynamic*)layers->AddLayer(UGC::UGLayer3DType::l3dDynamicModel, _U("AA@Route"), _U("BB"), TRUE);
// dyLayer3D->SetInitialized(true);
// UGLayer3DDynamic* dyLayer3D = new UGLayer3DDynamic();
// UGDynamicObjectlState dyObjState;
// dyObjState.ID = 0;
// dyObjState.Altitude = 25;
// dyObjState.Latitude = 32.234317;
// dyObjState.Longitude = 119.718567;
// p_UGLayer3DDynamic->AddObjectFromFile(_U("D:/plane.s3m"),dyObjState,1);
// p_UGLayer3DDynamic->SetStyle3D(style3D);
// dyLayer3D->SetStyle3D(style3D);
// bool ss = dyLayer3D->SaveKML(_U("E:/b.kml"));
// UGLayer3DModel* modelLayer3D = new UGLayer3DModel();
qDebug()<<"**************layersCount0:"<<layers->GetInnerCount();
// layers->SetEditableLayer(modelLayer3D,true);
// modelLayer3D->SetStyle3D(style3D);
// UGPlottingLayer3D* plotLayer = new UGPlottingLayer3D();
// UGLayer3D* kmlLayer = pSceneControl->AddLayerFromFile("E:/a.kml");
// kmlLayer->SetSelectable(false);
// kmlLayer->SetEditable(true);
// UGLayer3DModel* modelLayer3D = (UGLayer3DModel*)kmlLayer;
// UGGeoPlacemark* GP = new UGGeoPlacemark();
UGGeoPoint3D* p = new UGGeoPoint3D();
p->SetX(119.718567);
p->SetY(32.234317);
p->SetZ(20);
// GP->MakeWithGeometry(p);
// GP->SetGeometry(p);
// GP->SetPosition(UGPoint3D(119.718567,32.234317,20));
// GP->SetName(_U("Test"));
// UGStyle3D s;
// s.SetAltitudeMode(AltitudeMode::Absolute);
// s.SetFill3DMode(UGC::/*UGFill3DMode::*/FILL_FACE);
// s.SetPicturePath(_U("D:/Icon.png"));
// s.SetIconScale(5);
// s.SetPointSize(24);
// UGTextStyle t;
// t.SetSize(24);
// GP->SetNameTextStyle(&t);
// GP->SetStyle3D(&s);
// p->SetStyle3D(&s);
// UGGeoText3D* text3D = new UGGeoText3D();
// text3D->Make(_U("Text"),UGPoint3D(119.718567,32.234317,20));
// text3D->AddSub(_U("Text2"),UGPoint3D(119.719567,32.235317,20));
// RouteGlobalVariant routeGVar;
// text3D->SetTextStyle(routeGVar.getLabelTextStyle());
// UGGeoBillboard* billboard = new UGGeoBillboard();
// billboard->MakeWithGeometry(p);
// UGStyle3D bbsty;
// bbsty.SetPicturePath(_U("D:/Icon.png"));
// bbsty.SetAltitudeMode(AltitudeMode::Absolute);
// billboard->SetWidth(32);
// billboard->SetHeight(32);
// billboard->SetStyle3D(&bbsty);
// billboard->SetTag(0,_U("1-1"));
// billboard->SetPosition(UGPoint3D(119.718567,32.234317,20));
// pSceneControl->GetTrackingLayer3D()->Add(text3D,_U("a"));
// pSceneControl->GetTrackingLayer3D()->Remove(_U("a"));
// int i = text3D->IsValid();
// modelLayer3D->AddModel(model);
// int layertype = UGLayer3DType::l3dTree;
// kmlLayer->SetLayerType();
// layers->SetEditableLayer(pl,true);
// layers->TreeAddLayer(0,dyLayer3D);
// layers->TreeAddLayer(0,modelLayer3D);
qDebug()<<"**************layersCount1:"<<layers->GetInnerCount();
// layers->SetEditableLayer(modelLayer3D,true);
// modelLayer3D->AddModel(model);
// UGFeature* ft = NULL;
// res->GetFeature(ft);
// res->MoveFirst();
// UGFeature* ft = res->GetFeature();
// UGFeature* ft = new UGFeature();
// ft->SetGeometry(GP);
// UGArray< UGFeature > arrFeatures;
// UGArray< UGFeature* > arrFeatures;
// int i = arrFeatures.Add(*ft);
// planeLayer->SetEditable(true);
// qDebug()<<"***********:"<<arrFeatures.GetSize();
// planeLayer->SetDataSources(pDataSource);
// UGRenderObjectList* rol = kmlLayer->GetRenderObjectList();
// bool b = kmlLayer->AddNewFeatures(arrFeatures);
// bool b = kmlLayer->ModifyFeatures(arrFeatures);
// pl->SetStyle3D(style3D);
// UGLayer3D* pl = layers->AddLayer(planeLayer,_U("Plane"));
// pl->SetStyle3D(style3D);
// qDebug()<<"**************layersCount1:"<<layers->GetInnerCount();
// UGRenderManager rm;
// UGRenderFeature* rf = rm.CreateRenderFeature(UGGeometry::Type::GeoModel);
// UGRenderFeature* rf = rm.CreateRenderFeature(geometry);
// rf->SetGeometry(model);
// rf->SetName(_U("model"));
// rf->SetStyle3D(&style3D);
// UGRenderModelPro* rmp = (UGRenderModels*)rf;
// rol->Add(rf);
// rol->Update(scene->GetRenderParam());
// int rosize = rol->GetSize();
// kmlLayer->Update(scene->GetRenderParam());
// kmlLayer->Render(scene->GetRenderParam());
// scene->UpdateData();
// kmlLayer->SaveKML(_U("E:/b.kml"));
// qDebug()<<"**************RenderObjCount:"<<rol->GetSize();
// pl->Initialize(scene->GetRenderParam());
// pSceneControl->GetScene3D()->UpdateData();
// planeLayer->SetStyle3D(style3D);
// UGLayer3D* pl = layers->GetLayerInnerAt(0);
// qDebug()<<"**************layerName0:"<<Translator::UGStr2QStr(layers->GetLayerInnerAt(0)->GetName());
// UGLayer3D* pl = layers->GetLayerInner(_U("Plane"));
// qDebug()<<"**************layersCount1:";
// UGDatasetVector* dv = (UGDatasetVector*)pDataSource->GetDataset(_U("Plane")).get();
// if(!dv->IsOpen()) dv->Open();
// UGQueryDef query;
// UGRecordsetPtr res = dv->Query(query);
// qDebug()<<"*****************RecordCount:"<<res->GetRecordCount();
// res->MoveLast();
// UGGeometry* geometry = NULL;
// res->GetGeometry(geometry);
// UGGeoModelPro* model = (UGGeoModelPro*)geometry;
// model->SetPosition(UGPoint3D(119.718567,32.234317,20));
// model->SetStyle3D(&style3D);
// kmlLayer->Add(model,_U("model"));
// UGGeoLine3D* l = (UGGeoLine3D*)geometry;
// l->SetStyle3D(&style3D);
// UGStyle3D sty3D;
// sty3D.SetLineWidth(2);
// sty3D.SetLineColor3D(UGRGB(0,0,255));
// sty3D.SetAltitudeMode(AltitudeMode::Absolute);
// l->SetStyle3D(&sty3D);
// UGMarkerSymbolLib* ms = m_pWorkspace->GetResources()->GetMarkerSymbolLib();
// int id = ms->GetIDAt(ms->GetSymbolCount()-1);
// UGGeoPoint3D* p = new UGGeoPoint3D();
// p->Make(UGPoint3D(119.718567,32.234317,20));
// UGGeoPlacemark* pl = new UGGeoPlacemark();
// pl->SetName(_U("Test"));
// pl->SetPosition(UGPoint3D(119.718567,32.234317,20));
// pl->Set3DPoint(UGPoint3D(119.718567,32.234317,20));
// pl->SetGeometry(p);
// UGStyle3D sty3D;
// sty3D.SetMarkerStyle(318); //253268
//// sty3D.SetMarker3D(true);
// UGColorValue3D(1,0,0);
// sty3D.SetPointColor(UGColorValue3D(1,0,0));
// sty3D.SetMarkerSize(30);
// sty3D.SetFill3DMode(UGC::/*UGFill3DMode::*/FILL_FACE);
// sty3D.SetAltitudeMode(AltitudeMode::Absolute);
// sty3D.SetBottomAltitude(20);
// p->SetStyle3D(&sty3D);
// pl->SetStyle3D(&sty3D);
// plotLayer->Add(p,_U("point"));
// plotLayer->SetRefresh(true);
// p->SetStyle(&sty3D);
// UGStyle3D sty;
// sty.SetMarkerStyle(253268);
// sty.SetMarkerSize(30);
// sty.SetFixedPixelSize(true);
// sty.SetAltitudeMode(AltitudeMode::Absolute);
// UGLayer3D* planeLayer = pSceneControl->GetUGLayer3Ds()->AddLayer(_U("Test@Route"));
// planeLayer->SetStyle3D(sty);
// layers->RefreshRasterLayer(planeLayer);
// scene->SetTrackingGeometry();
// UGGeoPlacemark* pm = new UGGeoPlacemark();
// pm->SetGeometry(geometry);
// pm->SetStyle3D(&style3D);
// UGGeoPicture* pt = new UGGeoPicture;
// geometry->ConvertToPicture(*pt,1);
// UGStyle3D styE;
// styE.SetAltitudeMode(AltitudeMode::Absolute);
//// styE.SetMarker3D(true);
// geometry->Set3DPoint(UGPoint3D(119.718567,32.234317,20));
// geometry->SetStyle(&styE);
// UGLayer3Ds* layers = pSceneControl->GetUGLayer3Ds();
// layers->GetLayerInnerAt(0)->SetVisible(false); //_U("大路机场18@Route")
// UGGeoPicture* pt = (UGGeoPicture*) geometry;
// UGGeoLine3D* l = (UGGeoLine3D*) geometry;
// l->SetStyle3D(&style3D);
UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D();
// trackingLayer3D->SetAlwaysRender(true);
// trackingLayer3D->SetWorkspace(m_pWorkspace);
// trackingLayer3D->SetUseGeoStyle(true);
// qDebug()<<"**************TrackingCount0:"<<trackingLayer3D->GetCount();
// trackingLayer3D->Add(pl,_U("picture"));
// UGStyle3D* sty1 = trackingLayer3D->GetAt(0)->GetStyle3D();
// sty1->SetLineColor(UGRGB(0,0,255));
// trackingLayer3D->GetAt(0)->SetStyle3D(&sty3D);
// pSceneControl->GetSceneEditWnd()->SetUserAction(UGSceneUserAction::suaEdit,UGEditType3D::ET3D_PolyLine); //
// trackingLayer3D->SetEditable(true);
// trackingLayer3D->SetRefresh(false);
// layers->RefreshRasterLayer(trackingLayer3D);
// pSceneControl->GetScene3D()->GetCamera(_U("Camera"))->FlyTo(model);
// qDebug()<<"**************TrackingCount1:"<<trackingLayer3D->GetCount();
//// trackingLayer3D->GetRenderObjectList()
//// qDebug()<<"**************RenderObjectSize0:"<<trackingLayer3D->GetRenderObjectList()->GetSize();
// qDebug()<<"**************TrackingCount0:"<<trackingLayer3D->GetCount();
// UGRenderObject* ro = trackingLayer3D->Add(model,_U("point"));
// ro->SetAltitudeMode(AltitudeMode::Absolute);
// ro->RenderToScreen(pSceneControl->GetScene3D()->GetRenderParam());
// ro->Render(pSceneControl->GetScene3D()->GetRenderParam());
// UGRenderManager rm;
// UGRenderFeature* rf = rm.CreateRenderFeature(UGGeometry::GeoModel);
// rf->SetGeometry(model);
// UGArray< UGFeature > arrRenderFeatures;
// arrRenderFeatures.Add(*rf);
// bool b = trackingLayer3D->AddNewFeatures(arrRenderFeatures);
// trackingLayer3D->Add()
// qDebug()<<"**************TrackingCount1:"<<trackingLayer3D->GetCount();
// trackingLayer3D->Initialize(pSceneControl->GetScene3D()->GetRenderParam());
// trackingLayer3D->Render(pSceneControl->GetScene3D()->GetRenderParam());
// trackingLayer3D->Update(pSceneControl->GetScene3D()->GetRenderParam());
// UGRenderObjectList* rol = trackingLayer3D->GetRenderObjectList();
// qDebug()<<"**************RenderObjectSize1:"<<rol->GetSize();
// UGRenderObject* ro = trackingLayer3D->GetAt(0);
// qDebug()<<"**************RenderObjectVisible:"<<ro->IsVisible();
// pSceneControl->Refresh();
// scene->UpdateData();
// scene->Refresh();
// pSceneControl->GetScene3D()->GetCamera(_U("Camera"))->FlyTo(model);
// pSceneControl->GetScene3D()->Refresh();
// scene->ToXML(0,_U("MapWorkspace"));
}
//显示装订航线对话框
void MainWindow::showBindRouteDialog()
{
UGDataSource* ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
UGDatasetVector* bindRoute_dv = NULL;
//获取线数据集
if(mapType==MapType::Map2D)
bindRoute_dv = (UGDatasetVector*)ds->GetDataset(lineSetAlias).get();
else
bindRoute_dv = (UGDatasetVector*)ds->GetDataset(line3DSetAlias).get();
bindRoute_dv->Open();
//显示装订对话框
bindRouteDialog bindRouteDlg;
bindRouteDlg.setDataset(bindRoute_dv);
bindRouteDlg.exec();
bindRoute_dv = NULL;
ds = NULL;
}
//显示输入坐标点对话框
void MainWindow::showComputeOffsetPosition()
{
// qMapControl->ifComputePointMode = true; //开始自动计算点模式
QPoint LPressPoint = qMapControl->getLMousePressPoint();
// qDebug()<<"*******************x:"<<LPressPoint.x();
// qDebug()<<"*******************y:"<<LPressPoint.y();
inputPosDlg->setGeometry(LPressPoint.x()+5,LPressPoint.y()+5,inputPosDlg->size().width(),inputPosDlg->size().height());
// inputPosDlg.exec();
inputPosDlg->show();
}
//显示在线地图对话框
void MainWindow::showOnlineMapDialog()
{
LoadOnlineMapDialog onlineMapDlg;
if(mapType==MapType::Map2D)
onlineMapDlg.setWorkspace(m_pWorkspace,qMapControl->GetUGMapWnd());
else
{//3DMap
onlineMapDlg.setScene(pSceneControl);
}
onlineMapDlg.exec();
}
// 显示属性右键菜单
void MainWindow::showAttributeMenu()
{
rMenuType = RBtnMenuType::AttributeMenu;
connect(actionExportFile,&QAction::triggered,this,&MainWindow::exportKMLFile,Qt::UniqueConnection);
attributeRBtnMenu->exec(QCursor::pos());
rMenuType = RBtnMenuType::DefaultMenu;
}
//二三维地图切换
void MainWindow::transformMap()
{
if(pSceneView == NULL)
{
//三维场景容器初始化
initSceneControl(stackedWidget);
stackedWidget->addWidget(pSceneView);
pSceneView->startRender(30);
// pSceneView->setCursor(Qt::OpenHandCursor);
// UGDatasetVector* dv = (UGDatasetVector*)m_pWorkspace->GetDataSource(0)->GetDataset(_U("Plane")).get();
// ShowPlane3D* showPlane3D = new ShowPlane3D(pSceneControl,dv);
// showPlane3D->setPlanesCount(3);
// showPlane3D->setPlanesCount(1);
}
switch (mapType) {
case MapType::Map2D://切换为3D地图
{
stackedWidget->setCurrentIndex(1);
actionTransformMap->setIcon(QIcon(":/Resources/view_2d.png"));
actionTransformMap->setIconText("2D地图");
mapType = MapType::Map3D;
}
break;
case MapType::Map3D: //切换为2D地图
{
stackedWidget->setCurrentIndex(0);
actionTransformMap->setIcon(QIcon(":/Resources/view_3d.png"));
actionTransformMap->setIconText("3D地图");
mapType = MapType::Map2D;
}
break;
default:
break;
}
}
//导入场景数据
void MainWindow::importSceneData(QStringList imagePathList, QStringList terrainPathList)
{
qDebug() << "当前线程对象的地址: " << QThread::currentThread();
int imageDataCount = imagePathList.size();
int terrainDataCount = terrainPathList.size();
//显示进度条
progressDlg = new QProgressDialog();
progressDlg->setLabelText("影像文件导入中(0/" + QString::number(imageDataCount) + ")..."
+ "\n"
+ "地形文件导入中(0/" + QString::number(terrainDataCount) + ")...");
progressDlg->setWindowFlags(Qt::CustomizeWindowHint|Qt::WindowMinimizeButtonHint);
progressDlg->setWindowTitle("提示");
progressDlg->setCancelButton(nullptr);
QProgressBar* bar = new QProgressBar(progressDlg);
bar->setRange(0, 0);
bar->setValue(0);
progressDlg->setBar(bar);
progressDlg->setMinimumWidth(600);
progressDlg->setMinimumDuration(0);
progressDlg->setWindowModality(Qt::WindowModal);
progressDlg->setValue(0);
progressDlg->setAttribute(Qt::WA_DeleteOnClose);//关闭窗口时自动释放内存
progressDlg->showNormal();
/*******************************多线程导入数据(线程池方式)*******************************/
/*
// 线程池初始化,设置最大线程池数
QThreadPool::globalInstance()->setMaxThreadCount(5);
if(pSceneControl == NULL) return;
UGDataSource* pDataSource = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
if(pDataSource->IsOpen()) pDataSource->Open();
LoadTiffSceneData* loadImageTask = NULL;
LoadTiffSceneData* loadTerrianTask = NULL;
if(!imagePathList.isEmpty())
{
for(int i = 0;i<imagePathList.size();i++)
{
// progressDlg->setLabelText("影像文件(" + QString::number(i+1) + "/" + QString::number(imagePathList.size()) + ")导入中...");
QFileInfo fileInfo(imagePathList.at(i));
imageDataList.append(fileInfo.baseName());
UGString imageName = Translator::QStr2UGStr(fileInfo.baseName());
loadImageTask = new LoadTiffSceneData(pSceneControl,pDataSource,imageName,imagePathList.at(i),UGImportParams::ModeIMG);
connect(loadImageTask,&LoadTiffSceneData::sendTaskName,this,&MainWindow::closedProgressDialog);
QThreadPool::globalInstance()->start(loadImageTask);
loadImageTask = NULL;
}
}
if(!terrainPathList.isEmpty())
{
for(int j = 0;j<terrainPathList.size();j++)
{
// progressDlg->setLabelText("地形文件(" + QString::number(j+1) + "/" + QString::number(terrianPathList.size()) + ")导入中...");
QFileInfo fileInfo(terrainPathList.at(j));
terrainDataList.append(fileInfo.baseName());
UGString terrianName = Translator::QStr2UGStr(fileInfo.baseName());
loadTerrianTask = new LoadTiffSceneData(pSceneControl,pDataSource,terrianName,terrainPathList.at(j),UGImportParams::ModeGrid);
connect(loadTerrianTask,&LoadTiffSceneData::sendTaskName,this,&MainWindow::closedProgressDialog);
QThreadPool::globalInstance()->start(loadTerrianTask);
loadTerrianTask = NULL;
}
}
*/
/*******************************多线程导入数据*******************************/
if(pSceneControl == NULL) return;
UGDataSource* pDataSource = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
if(pDataSource->IsOpen()) pDataSource->Open();
// pSceneView->stopRender();
// 创建线程对象
QThread* loadSceneDataThread = new QThread();
// 创建工作的类对象
LoadSceneDataThread* loadSceneDataTask = new LoadSceneDataThread;
loadSceneDataTask->moveToThread(loadSceneDataThread);
loadSceneDataThread->start();
connect(this,&MainWindow::sendSceneDataList,loadSceneDataTask,&LoadSceneDataThread::receiveFileList);
// connect(loadSceneDataTask,&LoadSceneDataThread::sendTaskName,this,&MainWindow::closedProgressDialog);
connect(loadSceneDataTask,&LoadSceneDataThread::sendTaskFinishedCount,this,[=](int imageFinishedCount,int imageTotalCount,int terrianFinishedCount,int terrianTotalCount){
progressDlg->setLabelText("影像文件导入中(" + QString::number(imageFinishedCount) + "/" + QString::number(imageTotalCount) + ")..."
+ "\n"
+ "地形文件导入中(" + QString::number(terrianFinishedCount) + "/" + QString::number(terrianTotalCount) + ")...");
qDebug()<<"*********************ProgressDlgSetLabelTextSuccessed";
if((imageFinishedCount == imageTotalCount) && (terrianFinishedCount == terrianTotalCount))
{
qDebug()<<"*********************CloseProgressDlg";
progressDlg->close();
// delete progressDlg;
progressDlg = NULL;
qDebug()<<"*********************DeletedProgressDlg";
UGScene3D* pScene = pSceneControl->GetSceneEditWnd()->GetScene3D();
// 显示到数据集范围
if(imageTotalCount>0)
{
//pScene->GetCamera(_U("Camera"))->FlyToBounds(pScene->m_Layers.GetLayerInnerAt(0)->GetBounds(), 1);
pSceneControl->ViewToLayer(pScene->m_Layers.GetLayerInnerAt(0));
// pSceneControl->GetCameraWorld()->PitchCamera(UGMathEngine::DegreesToRadians(80));
// UGCameraGlobal* cgb = (UGCameraGlobal*)pScene->GetCamera(_U("Camera"));
UGRect2D bounds = pScene->m_Layers.GetLayerInnerAt(0)->GetBounds();
double lon_la = UGMathEngine::DegreesToRadians(bounds.left);
double lat_la = UGMathEngine::DegreesToRadians(bounds.bottom + bounds.Height()/2);
double lon_cb = UGMathEngine::DegreesToRadians(bounds.left+bounds.Width()/2);
double lat_cb = UGMathEngine::DegreesToRadians(bounds.bottom + bounds.Height()/2);
qDebug()<<"******************Distance:"<<UGMathEngine::SphericalDistance(lon_la,lat_la,lon_cb,lat_cb);
qDebug()<<"******************DistanceCos:"<<UGMathEngine::SphericalDistanceCos(lon_la,lat_la,lon_cb,lat_cb);
}
// UGCameraLocal* cgb = (UGCameraLocal*)pScene->GetCamera(_U("Camera"));
// qDebug()<<"**********************PI:"<<QString::number((60/180*PI),'f',4);
// UGCameraState cs;
// cs.dLat = UGMathEngine::DegreesToRadians(bounds.bottom+bounds.Height()/2);//UGMathEngine::DegreesToRadians(32.2367);
// cs.dLon = UGMathEngine::DegreesToRadians(bounds.left+bounds.Width()/2);//UGMathEngine::DegreesToRadians(119.717);
// cs.dAltitude = 1000;
// cs.dDistance = 1000;
// cs.dTilt = UGMathEngine::DegreesToRadians(80);
// cgb->FlyToCamera(cs,1000);
// cgb->SetLookAt(cs);
// cgb->SetCamera(cs);
// cgb->SetEyeTilt(1);
// cgb->FlyTilt(60/180*PI);
// cgb->FlyToLookAt();
// cgb->UpdateViewRange();
// pScene->GetCamera(_U("Camera"))->FlyTilt(60/180*PI);
// pSceneControl->GetCameraWorld()->PitchCamera(-90);
// UGCameraGlobal* camera = (UGCameraGlobal*)pScene->GetCamera(_U("Camera"));
// camera->m_StateCamera.dLat = 32.2367/180*PI;
// camera->m_StateCamera.dLon = 119.717/180*PI;
// camera->m_StateCamera.dAltitude = 2000;
// camera->m_StateCamera.dTilt = 60/180*PI;
// camera->m_StateLookAt.dLat = 32.2367/180*PI;
// camera->m_StateLookAt.dLon = 119.717/180*PI;
// camera->m_StateLookAt.dDistance = 2000;
// camera->m_StateLookAt.dTilt = 60/180*PI;
// camera->UpdateViewRange();
// pScene->UpdateData();
// pScene->Refresh();
// QEventLoop eventloop;
// QTimer::singleShot(2000, &eventloop, SLOT(quit()));
// eventloop.exec();
// pScene->GetCamera(_U("Camera"))->SetEyeTilt(45);
// UGCameraState cs = pScene->GetCamera(_U("Camera"))->GetCamera();
// qDebug()<<"*******************Lat:"<<pScene->GetCamera(_U("Camera"))->GetLatitude();
// qDebug()<<"*******************Lon:"<<cs.dLon;
// qDebug()<<"*******************Altitude:"<<pScene->GetCamera(_U("Camera"))->GetAltitude();
// qDebug()<<"*******************Heading:"<<cs.dHeading;
// qDebug()<<"*******************Roll:"<<cs.dRoll;
// qDebug()<<"*******************Tilt:"<<cs.dTilt;
// qDebug()<<"*********************Thread";
//释放线程
loadSceneDataThread->quit();
loadSceneDataThread->wait();
loadSceneDataThread->deleteLater();
qDebug()<<"*********************DeletedThread";
loadSceneDataTask->deleteLater();
qDebug()<<"*********************DeletedTask";
//test代码
loadModelData();
}
// m_mutex.unlock();
});
// loadSceneDataTask->receiveFileList(pSceneControl,pDataSource,imagePathList,terrainPathList);
emit sendSceneDataList(pSceneControl,pDataSource,imagePathList,terrainPathList);
/*
QThreadPool::globalInstance()->setMaxThreadCount(8);
if(pSceneControl == NULL) return;
UGDataSource* pDataSource = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
if(pDataSource->IsOpen()) pDataSource->Open();
GeoFileParser geoFileParser;
UGString ugImageLayerName;
UGLayer3D* pLayer = NULL;
UGString ugTerrianLayerName;
UGTerrainAccessor* tm = NULL;
//导入影像数据
if(!imagePathList.isEmpty())
{
// ShowProgressDialog* progressDlg = new ShowProgressDialog();
// connect(this,&MainWindow::closedProgressDialog,progressDlg,&ShowProgressDialog::closedProgressDialog);
// QThreadPool::globalInstance()->start(progressDlg);
// qDebug()<<"*****************activeThreadCount:"<<QThreadPool::globalInstance()->activeThreadCount();
// QTimer* timer = new QTimer();
// connect(timer, &QTimer::timeout, progressDlg, &ShowProgressDialog::updateProgressDialog);
// timer->start(100);//开启一个没有终点的定时器
for(int i = 0;i<imagePathList.size();i++)
{
// progressDlg->setLabelText("影像文件(" + QString::number(i+1) + "/" + QString::number(imagePathList.size()) + ")导入中...");
QFileInfo fileInfo(imagePathList.at(i));
UGString imageName = Translator::QStr2UGStr(fileInfo.baseName());
QElapsedTimer mstimer;
mstimer.start();
bool ss = geoFileParser.importTiffData(pDataSource,imageName,imagePathList.at(i),true);
float time = (double)mstimer.nsecsElapsed() / (double)1000000;
qDebug() << "ImageTime:::" << time/1000;
if(ss)
{
ugImageLayerName = imageName + _U("@") + Translator::QStr2UGStr(routeName); // 数据集名@数据源名,图层默认命名格式,也是通过该格式的名称获得关联数据
pLayer = pSceneControl->GetSceneEditWnd()->GetScene3D()->m_Layers.AddLayer(ugImageLayerName);
}
}
emit closedProgressDialog();
}
//导入地形数据
if(!terrianPathList.isEmpty())
{
for(int j = 0;j<terrianPathList.size();j++)
{
// progressDlg->setLabelText("地形文件(" + QString::number(j+1) + "/" + QString::number(terrianPathList.size()) + ")导入中...");
QFileInfo fileInfo(terrianPathList.at(j));
UGString terrianName = Translator::QStr2UGStr(fileInfo.baseName());
QElapsedTimer mstimer;
mstimer.start();
bool ss = geoFileParser.importTiffData(pDataSource,terrianName,terrianPathList.at(j),true,
UGImportParams::ModeGrid,UGDataCodec::encLZW);
float time = (double)mstimer.nsecsElapsed() / (double)1000000;
qDebug() << "TerrianTime:::" << time/1000;
if(ss)
{
ugTerrianLayerName = terrianName + _U("@") + Translator::QStr2UGStr(routeName); // 数据集名@数据源名,图层默认命名格式,也是通过该格式的名称获得关联数据
tm = pSceneControl->GetSceneEditWnd()->GetScene3D()->m_TerrainLayer3Ds.AddTerrainLayer(ugTerrianLayerName,terrianName);
}
}
}
// progressDlg->close();
// delete progressDlg;
if(!imagePathList.isEmpty())
{
pSceneControl->ViewToLayer(pLayer);
}
*/
}
//关闭进度条
void MainWindow::closedProgressDialog(QString taskName)
{
/***************************************线程池方式********************************/
/*
m_mutex.lock();
int imageIndex = imageDataList.indexOf(taskName);
int terrainIndex = terrainDataList.indexOf(taskName);
if(imageIndex>=0)
{
imageDataList.removeAt(imageIndex);
}
if(terrainIndex>=0)
{
terrainDataList.removeAt(terrainIndex);
}
QString importImageCount = QString::number(imageDataCount - imageDataList.size());
QString importTerrainCount = QString::number(terrainDataCount - terrainDataList.size());
progressDlg->setLabelText("影像文件导入中(" + importImageCount + "/" + QString::number(imageDataCount) + ")..."
+ "\n"
+ "地形文件导入中(" + importTerrainCount + "/" + QString::number(terrainDataCount) + ")...");
if(imageDataList.isEmpty() && terrainDataList.isEmpty())
{
progressDlg->close();
delete progressDlg;
progressDlg = NULL;
UGScene3D* pScene = pSceneControl->GetSceneEditWnd()->GetScene3D();
// 显示到数据集范围
pScene->GetCamera(_U("Camera"))->FlyToBounds(pScene->m_Layers.GetLayerInnerAt(0)->GetBounds(), 1);
}
m_mutex.unlock();
*/
}
//显示三维航点设置对话框
void MainWindow::showSettingFlightPoint3DDialog()
{
SettingFlightPoint3DDialog* settingFlightPoint3DDlg = new SettingFlightPoint3DDialog();
connect(pSceneView,&SceneView::sendTrackingGeometry,settingFlightPoint3DDlg,&SettingFlightPoint3DDialog::receiveTrackingGeometry);
connect(pSceneView,&SceneView::sendTrackedGeometry,settingFlightPoint3DDlg,&SettingFlightPoint3DDialog::receiveTrackedGeometry);
connect(settingFlightPoint3DDlg,&SettingFlightPoint3DDialog::showSaveRouteDialog,this,&MainWindow::showSaveRoute3DDialog);
settingFlightPoint3DDlg->show();
}
//显示三维航线保存对话框
void MainWindow::showSaveRoute3DDialog(UGGeometry* pGeometry)
{
saveRouteDialog saveRoute3DDlg;
//显示对话框
saveRoute3DDlg.setMaxValue(1);
saveRoute3DDlg.setDrawMode(1);
saveRoute3DDlg.setHeightVisible(false);
int ret = saveRoute3DDlg.exec();
if(ret==QDialog::Rejected) return;
//获取数据集
UGDataSource* ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
UGDatasetVector* dv = (UGDatasetVector*)ds->GetDataset(line3DSetAlias).get();
if(!dv->Open()) dv->Open();
//提取属性信息
RouteGlobalVariant routeGVar;
QMap<QString,QString> fieldsValue;
fieldsValue.insert(routeGVar.routeFieldsName.RouteID,QString::number(dv->GetObjectCount()+1));
fieldsValue.insert(routeGVar.routeFieldsName.RouteNumber,QString::number(saveRoute3DDlg.getRouteNumber()[1]));
fieldsValue.insert(routeGVar.routeFieldsName.RouteType,QString::number(saveRoute3DDlg.getRouteType()[1]));
fieldsValue.insert(routeGVar.routeFieldsName.IsClosedRoute,QString::number(saveRoute3DDlg.getRouteClosedState()[1]));
//写入数据集
GeoFeatureOperator geoFtOpt;
geoFtOpt.importGeometry3DAttribute(dv,pGeometry,fieldsValue);
//移除临时图层
UGString layername = routeGVar.line3DTempDtName + _U("@") + ds->GetAlias();
pSceneControl->removeLayer3D(layername);
ds = NULL;
dv = NULL;
}
//高亮当前导入的KML 3D几何对象
void MainWindow::highLightKMLGeometry(int currentGeometryID, int lastGeometryID)
{
UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D();
qDebug()<<"********************currentGeometryID:"<<currentGeometryID;
qDebug()<<"********************lastGeometryID:"<<lastGeometryID;
qDebug()<<"***********************Count:"<<trackingLayer3D->GetCount();
RouteGlobalVariant routeGVar;
UGStyle3D sty;
// 取消原高亮几何对象
// routeGVar.getHighLightStyle3D(sty);
routeGVar.getTemporaryStyle3D(sty);
UGRenderObject* ro = trackingLayer3D->GetAt(lastGeometryID-1); //
// ro->SetAffectedByGlobalEffects(false);
// ro->SetStyle3D(&sty);
ro->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D()); //
// qDebug()<<"********************R:"<<ro->GetStyle3D()->GetLineColor3D().r;
// qDebug()<<"********************g:"<<ro->GetStyle3D()->GetLineColor3D().g;
// qDebug()<<"********************b:"<<ro->GetStyle3D()->GetLineColor3D().b;
// qDebug()<<"********************Type:"<<ro->GetType();
// 高亮新几何对象
routeGVar.getHighLightStyle3D(sty);
UGRenderObject* ro1 = trackingLayer3D->GetAt(currentGeometryID-1);//
// ro1->SetAffectedByGlobalEffects(false);
// ro1->SetStyle3D(&sty);
ro1->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D()); //
// pSceneControl->GetScene3D()->UpdateData();
// pSceneControl->GetScene3D()->Refresh();
// pSceneControl->Refresh();
}
//右键菜单处理函数
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
if(rMenuType==RBtnMenuType::DefaultMenu && mapType == MapType::Map2D)
{
mapRBtnMenu->exec(QCursor::pos()); // 右键菜单被模态显示出来了
}
if(rMenuType==RBtnMenuType::DefaultMenu && mapType == MapType::Map3D)
{
/*
UGCameraWorld* camera = pSceneControl->GetScene3D()->GetCamera(_U("Camera"));
UGCameraState cs = camera->m_StateCamera;
pSceneControl->GetCameraWorld()->GetCamera(cs);
qDebug()<<"*************lat:"<<cs.dLat*180/PI;
qDebug()<<"*************lon:"<<cs.dLon*180/PI;
qDebug()<<"*************Distance:"<<cs.dDistance;
qDebug()<<"*************Altitude:"<<cs.dAltitude;
qDebug()<<"*************Heading:"<<cs.dHeading*180/PI;
qDebug()<<"*************Roll:"<<cs.dRoll*180/PI;
qDebug()<<"*************Tilt:"<<cs.dTilt*180/PI;
qDebug()<<"******************Lookat***********************";
UGCameraState cs1 = camera->m_StateLookAt;
qDebug()<<"*************lat1:"<<cs1.dLat*180/PI;
qDebug()<<"*************lon1:"<<cs1.dLon*180/PI;
qDebug()<<"*************Distance1:"<<cs1.dDistance;
qDebug()<<"*************Altitude1:"<<cs1.dAltitude;
qDebug()<<"*************Heading1:"<<cs1.dHeading*180/PI;
qDebug()<<"*************Roll1:"<<cs1.dRoll*180/PI;
qDebug()<<"*************Tilt1:"<<cs1.dTilt*180/PI;
UGVector3d vPos;
UGQuaternion4d q;
UGCameraWorld::PosAndOrientation2CameraState(vPos,q,cs);
qDebug()<<"*************vPos.x:"<<vPos.x;
qDebug()<<"*************vPos.y:"<<vPos.y;
qDebug()<<"*************vPos.z:"<<vPos.z;
qDebug()<<"*************q.x:"<<q.x;
qDebug()<<"*************q.y:"<<q.y;
qDebug()<<"*************q.z:"<<q.z;
qDebug()<<"*************q.w:"<<q.w;
*/
// if(pSceneControl->GetSceneEditWnd()->GetUserAction() != 105) return;
if(pSceneView->isEditStateFlag)
{//处于编辑模式,不弹出右键菜单
pSceneView->isEditStateFlag = false;
return;
}
sceneRBtnMenu->exec(QCursor::pos()); // 右键菜单被模态显示出来了
}
// qDebug()<<"*****************contextMenuEvent:";
}
//Slot:打开栅格地图
void MainWindow::openRasterMap()
{
//获取工作空间中的地图对象
//初始化一个空的地图,并与工作空间建立联系
//地图中的数据就来源于工作空间打开的数据源
UGMap* pMap = qMapControl->GetMap();
pMap->SetLineSmoothingMode(false);
pMap->SetWorkspace(m_pWorkspace);
//获取影像文件路径
QString qStrPath = QFileDialog::getOpenFileName(this,QString::fromLocal8Bit("OpenWorkSpace"),
":/supermap-iobjectscpp/MyProject/MapDisplay/SampleData/",
"GeoTIFF"+tr(u8"文件")+"(*.tif)");
if(qStrPath.isEmpty())
{
return;
}
//打开文件型数据库
UGDataSource* dataSource = m_pWorkspace->OpenDataSource(Translator::QStr2UGStr(qStrPath),
_U("tiffImage"),
UGEngineType::ImagePlugins);
if(dataSource == NULL)
{
return;
}
else
{
//获取第一个数据集
UGDatasetPtr dataset = dataSource->GetDataset(0);
LayerOperator layerOpt;
// 用自己实现的方法将dataset展示到地图中
layerOpt.appendDatasetToMap(dataset,pMap);
}
//刷新地图窗口
qMapControl->Refresh();
/************************************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);
// p->SetY(32.234539);
// UGStyle sty;
// sty.SetMarkerSize(16);
// sty.SetMarkerStyle(907711); //907711
// sty.SetMarkerWidth(20);
// sty.SetMarkerHeight(50);
// sty.SetFixedPixelSize(true);
// p->SetStyle(&sty);
// pMap->m_TrackingLayer.Add(p,_U("a"));
// qMapControl->Refresh();
}
/****************地图基础操作**********************/
#pragma region {
//放大地图操作
void MainWindow::zoomIn()
{
qMapControl->ZoomIn();
}
//缩小地图操作
void MainWindow::zoomOut()
{
qMapControl->ZoomOut();
}
//全幅显示地图操作
void MainWindow::viewEntire()
{
qMapControl->ViewEntire();
}
//平移浏览地图操作
void MainWindow::pan()
{
if(mapType==MapType::Map2D)
qMapControl->Pan();
else if(mapType==MapType::Map3D)
pSceneControl->Pan();
}
//选择要素操作
void MainWindow::Select()
{
if(mapType==MapType::Map2D)
qMapControl->Select();
else if(mapType==MapType::Map3D)
pSceneControl->Select();
}
#pragma endregion }
/****************地图量算操作**********************/
#pragma region {
//量算距离
void MainWindow::calcLength()
{
qMapControl->CalcuLength();
}
//量算面积
void MainWindow::calcArea()
{
qMapControl->CalcuArea();
}
//量算角度
void MainWindow::calcAngle()
{
qMapControl->CalcuAngle();
}
#pragma endregion}
/****************矢量要素绘制**********************/
#pragma region {
//绘制点
void MainWindow::drawPoint()
{
// qDebug()<<"isEmpty1:"<<m_pWorkspace->m_DataSources.IsEmpty();
// for (int i=0;i<m_pWorkspace->m_DataSources.GetCount();i++)
// {
// qDebug()<<"DataSourceName:"<<Translator::UGStr2QStr(m_pWorkspace->m_DataSources.m_strArrNames[i]);
// }
drawMode = 1;
qMapControl->drawMode = drawMode;
//获取数据源
UGDataSource* ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
// qDebug()<<"Proj:" << ds->GetPrjCoordSys().GetGeoCoordSys().GetTypeID();
MapDataManeger mapDataManeger;
UGString pointAlias = _U("Marks");
if(!ds->GetDataset(pointAlias))
{//点数据集不存在则创建
//创建点数据集
mapDataManeger.createVectorSet(ds,UGDataset::Point,pointAlias);
}
//获取点数据集
UGDatasetPtr pointSet = ds->GetDataset(pointAlias);
pointSet->SetPrjCoordSys(UGPrjCoordSys(4326));//设置坐标系为WGS1984
// qDebug()<<"pointSetProj:" << pointSet->GetPrjCoordSys().GetGeoCoordSys().GetTypeID();
//将点数据集添加到地图
UGMap* pUGMap = qMapControl->GetMap();
UGLayer* pointLayer = pUGMap->m_Layers.AddDataset(pointSet,true, UGLayer::UG_Layer_Normal,pointAlias);
LayerOperator layerOpt;
layerOpt.setVectorLayerStyle(pointLayer,UGDataset::Point); //设置图层Style
if (pointLayer != NULL)
{
pointLayer->SetSelectable(true); //设置图层可选择
pUGMap->m_Layers.SetEditableLayer(pointLayer,true);//设置图层可编辑
qMapControl->GetUGMapWnd()->SetUserAction(UGDrawParamaters::uaEdit,UGEditType::ET_Point);
}
else
{
}
}
//绘制线
void MainWindow::drawLine()
{
//获取数据源
UGDataSource* ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
GeoFeatureOperator geoFtOpt;
RouteGlobalVariant routeGVar;
if(mapType == MapType::Map3D)
{
//创建临时数据集
const UGString datasetName = routeGVar.line3DTempDtName;
MapDataManeger mapDataMag;
UGDatasetVector* dv = NULL;
UGRecordsetPtr res;
if(ds->GetDataset(datasetName)==NULL)
dv = mapDataMag.createVectorSet(ds,UGDataset::LineZ,datasetName).get();
else
{//清空临时数据集里的全部记录
dv = (UGDatasetVector*)(ds->GetDataset(datasetName).get());
if(!dv->IsOpen()) dv->Open();
UGQueryDef query;
res = dv->Query(query);
qDebug()<<"***************RecordCount:"<<res->GetRecordCount();
res->DeleteAll();
res->Update();
}
UGString layer3DName = datasetName + _U("@") + ds->GetAlias(); //图层名命名为:数据集名@数据源名
connect(pSceneView,&SceneView::sendTrackedGeometry,this,[=](UGGeometry* pGeometry){
//接收绘制完成的航线,添加到临时数据集,并显示
UGGeoLine3D* line3D = (UGGeoLine3D*)pGeometry;
res->AddNew(line3D);
res->Update();
pSceneControl->Refresh();
});
// UGDataSource* ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
// if(!ds->Open()) ds->Open();
// ds->GetDataset(line3DSetAlias)->Open();
// pSceneControl->GetSceneEditWnd()->SetUserAction(UGSceneUserAction::suaMeasureDistance);
// geoFtOpt.drawLine3D(pSceneView,Translator::QStr2UGStr(routeName),line3DSetAlias);
geoFtOpt.drawLine3D(pSceneView,layer3DName);
}
if(mapType == MapType::Map2D)
{
drawMode = 2;
qMapControl->drawMode = drawMode;
geoFtOpt.drawLine(qMapControl,ds,lineSetAlias);
}
ds = NULL;
/*
drawMode = 2;
qMapControl->drawMode = drawMode;
//获取数据源
UGDataSource* ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
//获取线数据集
UGDatasetPtr lineSet = ds->GetDataset(lineSetAlias);
lineSet->SetPrjCoordSys(UGPrjCoordSys(4326));//设置坐标系为WGS1984
//将线数据集添加到地图
UGMap* pUGMap = qMapControl->GetMap();
UGLayer* lineLayer = pUGMap->m_Layers.AddDataset(lineSet,true, UGLayer::UG_Layer_Normal,lineSetAlias);
LayerOperator layerOpt;
layerOpt.setVectorLayerStyle(lineLayer,UGDataset::Line); //设置图层Style
// UGStyle stytest;
// stytest.SetLineStyle(6); //设置线样式
// stytest.SetLineColor(UGRGB(255,0,0)); //设置符号颜色
// stytest.SetLineWidth(1); //设置线宽度
if (lineLayer != NULL)
{
lineLayer->SetSelectable(true); //设置图层可选择
pUGMap->m_Layers.SetEditableLayer(lineLayer,true);//设置图层可编辑
UGMapEditorWnd* pEditorWnd = qMapControl->GetUGMapWnd();
pEditorWnd->SetUserAction(UGDrawParamaters::uaEdit,UGEditType::ET_PolyLine);
// pEditorWnd->SetTrackingStyle(stytest); //设置交互式绘制几何对象时的风格。
}
else
{
}
*/
}
//绘制多边形
void MainWindow::drawPolygon()
{
drawMode = 3;
qMapControl->drawMode = drawMode;
qMapControl->GetUGMapWnd()->SetUserAction(UGDrawParamaters::uaEdit,UGEditType::ET_PolyGon);
// UGDataSource* ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
// UGDatasetVector* dv = (UGDatasetVector*) ds->GetDataset(2).get();
////// qDebug()<<"IsOpen:"<< dv->IsOpen();
//// dv->Open();
////// qDebug()<<"dsName:" << Translator::UGStr2QStr(dv->GetName());
////// qDebug()<<"RecordsetCount:"<<dv->GetRecordsetCount();
//// UGGeoRegion* rg = new UGGeoRegion();
// UGQueryDef queryDef;
// queryDef.m_nOptions = UGQueryDef::Both;
// queryDef.m_nType = UGQueryDef::General;
// queryDef.m_nMode = UGQueryDef::GeneralQuery;
// queryDef.m_nCursorType = UGQueryDef::OpenStatic; //OpenStatic,用于读取数据OpenDynamic,用于数据增删改
// queryDef.m_strFilter = _U("");
// UGRecordsetPtr re = dv->Query(queryDef);
//// qDebug()<< "@@@@@2:"<<re->m_nRecordCount;
// qDebug()<< "@@@@@2:"<<(re==NULL);
// re->MoveFirst();
// UGVariant v;
// re->GetFieldValue(_U("smx"),v);
// UGGeoRegion* r = new UGGeoRegion();
//// UGGeometry* r1 = new UGGeometry(r);
//// re->GetGeometryDirect();
// qDebug()<< "@@@@@HasGeometry:"<<re->HasGeometry();
// qDebug()<< "@@@@@2:"<<(re->IsEmpty());
//// re->GetFeature()->GetGeometry()->ConvertToRegion(*r,0);
//// qDebug()<<"PointsCount:"<<r->GetPointCount();
//// const UGPoint2D* p = r->GetPoints();
// UGGeoRegion reg;
// UGGeometry * pTempGeomtry = NULL;
// re->GetGeometry(pTempGeomtry,0);
// r = dynamic_cast<UGGeoRegion*>(pTempGeomtry);
// qDebug()<<"PointsCount:"<<r->GetPointCount();
// qDebug()<<"p:"<<(p==NULL);
// qDebug()<<"x:"<<p->x;
// qDebug()<<"y:"<<p->y;
// qDebug()<<"p:"<<(!p);
// while(p)
// {
// qDebug()<<"YES";
// qDebug()<<"x:"<<p->x;
// qDebug()<<"y:"<<p->y;
// p++;
// }
// re->GetGeometryDirect(region);
// qDebug()<< "@@@@@2:"<<(re==NULL);
// qDebug()<< "@@@@@HasGeometry:"<<re->HasGeometry();
// re->GetGeometry(&rg,0);
/*******************上面是test*************************/
// qMapControl->createMode = 3;
// //获取数据源
// UGDataSource* ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
// MapDataManeger mapDataManeger;
// UGString polygonAlias = _U("Geofencing");
// if(!ds->GetDataset(polygonAlias))
// {//点数据集不存在则创建
// //创建点数据集
// mapDataManeger.createVectorSet(ds,UGDataset::Region,polygonAlias);
// }
// //获取点数据集
// UGDatasetPtr polygonSet = ds->GetDataset(polygonAlias);
// polygonSet->SetPrjCoordSys(UGPrjCoordSys(4326));//设置坐标系为WGS1984
// //将点数据集添加到地图
// UGMap* pUGMap = qMapControl->GetMap();
// UGLayer* polygonLayer = pUGMap->m_Layers.AddDataset(polygonSet,true, UGLayer::UG_Layer_Normal,polygonAlias);
// LayerOperator layerOpt;
// layerOpt.setVectorLayerStyle(polygonLayer,UGDataset::Region); //设置图层Style
// if (polygonLayer != NULL)
// {
// polygonLayer->SetSelectable(true); //设置图层可选择
// pUGMap->m_Layers.SetEditableLayer(polygonLayer,true);//设置图层可编辑
// qMapControl->GetUGMapWnd()->SetUserAction(UGDrawParamaters::uaEdit,UGEditType::ET_PolyGon);
// }
// else
// {
// }
}
#pragma endregion}