From df6b22d7bd373555790b817dbaa344d72a44ecd2 Mon Sep 17 00:00:00 2001 From: cbwu Date: Sat, 17 Jun 2023 14:42:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=B8=89=E7=BB=B4?= =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E5=9C=B0=E5=9B=BE=E3=80=81=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E5=AE=9A=E4=BD=8D=E3=80=81kml=E6=96=87=E4=BB=B6=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD=EF=BC=9B=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=BA=86=E4=BF=A1=E5=8F=B7=E6=A7=BD=E9=87=8D=E5=A4=8D?= =?UTF-8?q?connect=E8=BF=9E=E6=8E=A5=E5=AF=BC=E8=87=B4=E7=9A=84=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=AF=BC=E5=85=A5=E8=8F=9C=E5=8D=95=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E5=BC=B9=E5=87=BA=E7=9A=84bug=EF=BC=8C=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BA=86=E6=98=BE=E7=A4=BA=E8=88=AA=E7=BA=BF=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E4=B8=AD=E8=88=AA=E7=BA=BF=E7=B1=BB=E5=9E=8B=E9=80=89=E9=A1=B9?= =?UTF-8?q?=E4=B8=8D=E5=9B=BA=E5=AE=9A=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MapDisplay.pro.user | 2 +- displayroutedialog.cpp | 19 +-- displayroutedialog.h | 5 +- geofeatureoperator.cpp | 57 +++++-- geofileparser.cpp | 2 + layeroperator.cpp | 109 ++++++++++++- layeroperator.h | 18 +++ mainwindow.cpp | 345 ++++++++++++++++++++++++++++++++--------- mainwindow.h | 8 +- routeglobalvariant.cpp | 40 ++--- routeglobalvariant.h | 4 + scenecontrol.cpp | 35 +++-- scenecontrol.h | 2 +- sceneview.cpp | 5 + sceneview.h | 1 + 15 files changed, 512 insertions(+), 140 deletions(-) diff --git a/MapDisplay.pro.user b/MapDisplay.pro.user index 9fedd54a..714b10b2 100644 --- a/MapDisplay.pro.user +++ b/MapDisplay.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/displayroutedialog.cpp b/displayroutedialog.cpp index 3800da4b..8146cb11 100644 --- a/displayroutedialog.cpp +++ b/displayroutedialog.cpp @@ -26,7 +26,7 @@ DisplayRouteDialog::DisplayRouteDialog(QWidget *parent) : RouteType = routeGVar.getRouteType(); - mapType = 0; + this->is3DMap = false; } @@ -44,11 +44,13 @@ void DisplayRouteDialog::setDataset(UGDatasetPtr dt) void DisplayRouteDialog::setMapEditorWnd(UGMapEditorWnd *pMapEditorWnd) { this->pMapEditorWnd = pMapEditorWnd; + this->is3DMap = false; } void DisplayRouteDialog::setSceneControl(SceneControl *pSceneControl) { this->pSceneControl = pSceneControl; + this->is3DMap = true; } void DisplayRouteDialog::addRouteTypeItem() @@ -71,23 +73,12 @@ void DisplayRouteDialog::addRouteTypeItem() } } -void DisplayRouteDialog::setMapType(bool isMap3D) -{ - if(isMap3D) - { - mapType = 1; - } - else - { - mapType = 0; - } -} - void DisplayRouteDialog::addRouteNumberItem(UGRecordsetPtr res) { ui->RouteNumberCbbox->clear(); QStringList strl; UGVariant v; + res->MoveFirst(); if(res) { while (!res->IsEOF()) { //获取航线编号 @@ -400,7 +391,7 @@ void DisplayRouteDialog::on_displayBtn_clicked() // this->reject(); return; } - if(mapType==1) + if(is3DMap) { showRoute3D(); } diff --git a/displayroutedialog.h b/displayroutedialog.h index b7799fd7..af5d6360 100644 --- a/displayroutedialog.h +++ b/displayroutedialog.h @@ -36,9 +36,6 @@ public: void addRouteTypeItem(); // 添加航线类型 - void setMapType(bool isMap3D = false); //设置是否三维地图类型 - - private slots: void on_RouteTypeCbbox_currentIndexChanged(int index); @@ -76,7 +73,7 @@ private: QMap> routeTags; - int mapType; + bool is3DMap; //二三维标识 }; #endif // DISPLAYROUTEDIALOG_H diff --git a/geofeatureoperator.cpp b/geofeatureoperator.cpp index d4eed255..a67f92ab 100644 --- a/geofeatureoperator.cpp +++ b/geofeatureoperator.cpp @@ -9,6 +9,7 @@ #include "layeroperator.h" #include "mapdatamaneger.h" #include +#include "Geometry3D/UGGeoLine3D.h" GeoFeatureOperator::GeoFeatureOperator() @@ -91,13 +92,35 @@ int GeoFeatureOperator::importFeatureAttribute(UGDatasetVector *dv, UGGeometry* UGRecordsetPtr saveRes = queryFeature(dv,Translator::QStr2UGStr(queryFilter)); UGGeoLine l; - pGeometry->ConvertToLine(l,0); + UGGeoLine3D* l3D = NULL; + bool is3D = false; + if(pGeometry->GetType()==UGGeometry::GeoLine) + { + pGeometry->ConvertToLine(l,0); + } + else if(pGeometry->GetType()==UGGeometry::GeoLine3D) + { + is3D = true; + l3D = (UGGeoLine3D*) pGeometry; + } + if(isClosedRoute) {//自动闭合线段 - if(l.GetStartNode() != l.GetEndNode()) + if(pGeometry->GetType()==UGGeometry::GeoLine) { - UGPoint2D addPoint = l.GetStartNode(); - l.InsertPoint(0,l.GetPointCount(),addPoint); //添加首节点 + if(l.GetStartNode() != l.GetEndNode()) + { + UGPoint2D addPoint = l.GetStartNode(); + l.InsertPoint(0,l.GetPointCount(),addPoint); //添加首节点 + } + } + else if(pGeometry->GetType()==UGGeometry::GeoLine3D) + { + if(l3D->GetStartNode() != l3D->GetEndNode()) + { + UGPoint3D addPoint = l3D->GetStartNode(); + l3D->InsertPoint(0,l3D->GetPointCount(),addPoint); //添加首节点 + } } } @@ -117,8 +140,13 @@ int GeoFeatureOperator::importFeatureAttribute(UGDatasetVector *dv, UGGeometry* if (ret == QMessageBox::Yes) { saveRes->Edit(); - saveRes->SetGeometry(l); - saveRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteHeight),UGVariant(routeHeight)); + if(is3D) + saveRes->SetGeometry(*l3D); + else + { + saveRes->SetGeometry(l); + saveRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteHeight),UGVariant(routeHeight)); + } saveRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.IsClosedRoute),UGVariant(isClosedRoute)); saveRes->Update(); @@ -138,23 +166,34 @@ int GeoFeatureOperator::importFeatureAttribute(UGDatasetVector *dv, UGGeometry* //添加航线 if(isAddGeometry) { - int ss = allRes->AddNew(&l); + int ss; + if(is3D) + ss = allRes->AddNew(l3D); + else + ss = allRes->AddNew(&l); if(ss<0) return 0; } //添加航线信息 allRes->MoveLast(); allRes->Edit(); - if(isClosedRoute && !isAddGeometry) allRes->SetGeometry(l); + if(isClosedRoute && !isAddGeometry) + { + if(is3D) + allRes->SetGeometry(*l3D); + else + allRes->SetGeometry(l); + } // UGVariant v; // allRes->GetFieldValue(_U("RouteID"),v); // qDebug()<<"**********************2:"<ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteID),UGVariant(routeID)); allRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteNumber),UGVariant(routeNumber)); allRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteType),UGVariant(routeType)); - allRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteHeight),UGVariant(routeHeight)); allRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteName),UGVariant(routeName)); allRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.IsClosedRoute),UGVariant(isClosedRoute)); + if(!is3D) + allRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteHeight),UGVariant(routeHeight)); //提交记录修改 allRes->Update(); diff --git a/geofileparser.cpp b/geofileparser.cpp index c7ca4eca..8809ef85 100644 --- a/geofileparser.cpp +++ b/geofileparser.cpp @@ -63,6 +63,7 @@ bool GeoFileParser::importKMLData(UGDataSource *pDataSource, UGString datasetNam kmlParams.SetDestDTName(datasetName); //设置目标数据集名称 kmlParams.SetFilePathName(Translator::QStr2UGStr(importPath)); kmlParams.SetDestCoordSys(UGPrjCoordSys (4326)); //设置坐标系:WGS-84 +// kmlParams.SetOverWrite(true); UGint ii = kmlParams.GetFileType(); int ss = UGExchangeParamsManager::IsValidImportParams(ii, kmlParams); @@ -81,6 +82,7 @@ bool GeoFileParser::exportKMLData(UGC::UGDataSource *pDataSource, QString datase exportKMLParams.SetFilePathName(Translator::QStr2UGStr(savePath)); //导出文件全路径 exportKMLParams.SetDtNameToBeExported(Translator::QStr2UGStr(datasetName)); //要导出的数据集名称,数据集坐标系必须为WGS-84 exportKMLParams.SetRecordFilter(Translator::QStr2UGStr(strRecordFilter)); //过滤条件 + exportKMLParams.SetOverWrite(true); //强制覆盖 return exchange.Export(exportKMLParams); } diff --git a/layeroperator.cpp b/layeroperator.cpp index 51f6a852..149861cd 100644 --- a/layeroperator.cpp +++ b/layeroperator.cpp @@ -5,6 +5,8 @@ #include "translator.h" #include "Geometry/UGGeoLine.h" #include "Geometry/UGGeoPoint.h" +#include "Scene/UGSelection3D.h" +#include "Render/UGRenderObject.h" LayerOperator::LayerOperator() { @@ -13,8 +15,6 @@ LayerOperator::LayerOperator() QMap LayerOperator::getSelectedFeature(UGMap *pMap) { - RouteGlobalVariant routeGVar; - UGLayer* layer = NULL; UGString layerName; UGSelection* selection = NULL; @@ -43,7 +43,8 @@ QMap LayerOperator::getSelectedFeature(UGMap *pMap) num.clear(); selection = NULL; } - + selection = NULL; + layer = NULL; return featureInfo; } @@ -150,7 +151,6 @@ void LayerOperator::addNodeLabel(UGGeoLine *pGeoline, UGDynamicLayer *pLabelDyLa UGPoint2D point; //labelStyle - RouteGlobalVariant routeGVar; UGTextStyle tSty; tSty.SetBackColor(routeGVar.getRouteTypeColor(routeType.toInt())); tSty.SetForeColor(routeGVar.getRouteTypeColor(routeType.toInt())); @@ -182,3 +182,104 @@ void LayerOperator::addNodeLabel(UGGeoLine *pGeoline, UGDynamicLayer *pLabelDyLa } } +//导入kml文件时临时显示航线,仅用于二维地图 +void LayerOperator::showKMLTemporary(QMapControl *qMapControl, UGRecordsetPtr kmlRes) +{ + //添加航线到Tracking Layer + LayerOperator layerOperator; + UGStyle sty; + routeGVar.getTemporaryStyle(sty); + /* Tracking Layer + UGTrackingLayer* pTrackingLayer = &qMapControl->GetMap()->m_TrackingLayer; + layerOperator.addGeometryInTrackingLayer(pTrackingLayer,res,sty); + routeGVar.getHighLightStyle(sty); + UGGeoEvent* pGeoEvent = pTrackingLayer->GetAt(0); + pGeoEvent->SetStyle(sty); //设置第一条航线高亮 + */ + //将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(); + + pMap = NULL; +} + +//添加几何对象到三维追踪层 +void LayerOperator::addGeometryToTrackingLayer3D(SceneControl *pSceneControl, UGRecordsetPtr kml3DRes) +{ + UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D(); + UGGeometry* pGeometry = NULL; + UGGeoLine3D* line3D = NULL; + UGRenderObject* ro = NULL; + UGStyle3D sty; + routeGVar.getHighLightStyle3D(sty); + //高亮当前正在导入的线段 + int i = 1; + kml3DRes->MoveFirst(); + kml3DRes->GetGeometry(pGeometry); + line3D = (UGGeoLine3D*)pGeometry; + line3D->SetStyle3D(&sty); + trackingLayer3D->Add(line3D,Translator::QStr2UGStr("Geometry"+QString::number(i))); + kml3DRes->MoveNext(); + pGeometry = NULL; + line3D = NULL; + ro = NULL; + // 剩余默认风格 + routeGVar.getTemporaryStyle3D(sty); + while (!kml3DRes->IsEOF()) { + i++; + kml3DRes->GetGeometry(pGeometry); + line3D = (UGGeoLine3D*)pGeometry; + line3D->SetStyle3D(&sty); + ro = trackingLayer3D->Add(line3D,Translator::QStr2UGStr("Geometry"+QString::number(i))); +// ro->SetStyle3D(&sty); + kml3DRes->MoveNext(); + pGeometry = NULL; + line3D = NULL; + ro = NULL; + } + + trackingLayer3D = NULL; +} + +// 获取Layer3D中选中几何对象标记信息 +QMap LayerOperator::getSelectedFeature3D(SceneControl *pSceneControl) +{ + UGArray* pSelectionArr = NULL; + UGSelection3D* selection = NULL; + UGRecordsetPtr res; + UGVariant v; + QStringList num; + QMap featureInfo; + + pSelectionArr = pSceneControl->GetGeoSelections(); + for(int i = 0;iGetSize();i++) + {//获取选中要素的航线编号以及航线类型,用于数据集查询 + selection = pSelectionArr->GetAt(i); + res = pSceneControl->ToRecordset(selection); + res->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteType),v); + int type = v.ToInt(); + res->MoveFirst(); + while(!res->IsEOF()) + { + res->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteNumber),v); + num << Translator::UGStr2QStr(v.ToString()); + res->MoveNext(); + } + featureInfo.insert(type,num); + num.clear(); + selection = NULL; + res = NULL; + } + pSelectionArr = NULL; + + return featureInfo; +} + diff --git a/layeroperator.h b/layeroperator.h index 37f8923d..9193d4bb 100644 --- a/layeroperator.h +++ b/layeroperator.h @@ -4,6 +4,9 @@ #include "Map/UGMap.h" #include "Scene/UGLayer3D.h" #include +#include "routeglobalvariant.h" +#include "qmapcontrol.h" +#include "scenecontrol.h" using namespace UGC; @@ -30,6 +33,21 @@ public: //添加航点标记 void addNodeLabel(UGGeoLine* pGeoline,UGDynamicLayer* pLabelDyLayer,QString routeType,QString routeNum); + //导入kml文件时临时显示航线 + void showKMLTemporary(QMapControl* qMapControl,UGRecordsetPtr kmlRes); + +public: //用于三维场景的函数 + //导入kml3D文件时临时显示航线 + void showKML3DTemporary(SceneControl* pSceneControl,UGRecordsetPtr kml3DRes); + + //添加几何对象到三维追踪层 + void addGeometryToTrackingLayer3D(SceneControl* pSceneControl,UGRecordsetPtr kml3DRes); + + // 获取Layer3D中选中几何对象标记信息 + QMap getSelectedFeature3D(SceneControl* pSceneControl); + +private: + RouteGlobalVariant routeGVar; }; #endif // LAYEROPERATOR_H diff --git a/mainwindow.cpp b/mainwindow.cpp index 216c9e1f..1a09ef16 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -50,6 +50,7 @@ #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" @@ -801,7 +802,6 @@ void MainWindow::addSceneActionConnect() DisplayRouteDialog displayRouteDlg; displayRouteDlg.setDataset(Route3D_ds); displayRouteDlg.setSceneControl(pSceneControl); - displayRouteDlg.setMapType(true); displayRouteDlg.addRouteTypeItem(); displayRouteDlg.exec(); @@ -809,9 +809,13 @@ void MainWindow::addSceneActionConnect() }); // 连接信号actionImportRoute和槽导入 - connect(actionImportRoute,&QAction::triggered,this,[=](){ - importKMLData(); + connect(actionSceneImportRoute,&QAction::triggered,this,[=](){ + importKML3DData(); }); + + /********************场景右键属性菜单信号槽连接********************/ + //连接actionExportFile与KML导出函数 + connect(actionExportFile,&QAction::triggered,this,&MainWindow::exportKMLFile); } //Scene连接信号和槽的函数 @@ -820,6 +824,9 @@ void MainWindow::addSceneConnect() // connect(pSceneView,&SceneView::sendTrackedGeometry,this,&MainWindow::showSaveRoute3DDialog); connect(pSceneView,&SceneView::showSettingFlightPointDialg,this,&MainWindow::showSettingFlightPoint3DDialog); + + //连接右键属性菜单信号 + connect(pSceneView,&SceneView::showAttributeMenu,this,&MainWindow::showAttributeMenu); } @@ -870,18 +877,13 @@ void MainWindow::importKMLData() GeoFeatureOperator geoFtOperator; UGRecordsetPtr kmlRes = geoFtOperator.queryFeature(kmlDv); - //添加航线到Tracking Layer LayerOperator layerOperator; RouteGlobalVariant routeGVar; UGStyle sty; routeGVar.getTemporaryStyle(sty); - /* Tracking Layer - UGTrackingLayer* pTrackingLayer = &qMapControl->GetMap()->m_TrackingLayer; - layerOperator.addGeometryInTrackingLayer(pTrackingLayer,res,sty); - routeGVar.getHighLightStyle(sty); - UGGeoEvent* pGeoEvent = pTrackingLayer->GetAt(0); - pGeoEvent->SetStyle(sty); //设置第一条航线高亮 - */ +// if(mapType==MapType::Map2D) +// layerOperator.showKMLTemporary(qMapControl,kmlRes); + //将kml航线临时展示在动态图层 UGMap* pMap = qMapControl->GetMap(); UGDynamicLayer* pDyLayer = NULL; @@ -920,17 +922,18 @@ void MainWindow::importKMLData() //qDebug()<<"*******************RecordCount:"<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(); }); //显示弹窗 @@ -941,9 +944,201 @@ void MainWindow::importKMLData() 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 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:"<GetObjectCount(); + // kmlRes->MoveNext(); + pGeometry = NULL; + kmlDv = NULL; + }); + + //高亮当前要导入的航线 + connect(saveKMLDlg,&saveRouteDialog::highLightGeometry,this,[&](int currentGeometryID,int lastGeometryID){ +// qDebug()<<"********************currentGeometryID:"<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 featureInfo; + if(mapType==MapType::Map2D) + featureInfo = layerOpt.getSelectedFeature(qMapControl->GetMap()); + else if(mapType==MapType::Map3D) + featureInfo = layerOpt.getSelectedFeature3D(pSceneControl); + //构造SQL查询条件 + QStringList filterlist; + QList 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() { @@ -1082,7 +1277,7 @@ void MainWindow::loadModelData() // pDataSource = NULL; //模型移动测试 - UGDatasetVector* dv = (UGDatasetVector*)pDataSource->GetDataset(_U("Plane")).get(); //FlightLines3D +// UGDatasetVector* dv = (UGDatasetVector*)pDataSource->GetDataset(_U("FlightLines3D")).get(); //FlightLines3D // ShowPlane3D* plane3D = new ShowPlane3D(pSceneControl,dv); // plane3D->setPlanesCount(1); // plane3D->startFly(); @@ -1165,11 +1360,11 @@ void MainWindow::loadModelData() UGStyle3D style3D; // style3D.SetMarker3D(true); // style3D.SetScaleBySymbol(true); - style3D.SetFixedPixelSize(false); - style3D.SetFill3DMode(UGC::/*UGFill3DMode::*/FILL_FACE); +// style3D.SetFixedPixelSize(false); +// style3D.SetFill3DMode(UGC::/*UGFill3DMode::*/FILL_FACE); style3D.SetAltitudeMode(AltitudeMode::Absolute); -// style3D.SetLineWidth(1); -// style3D.SetLineColor(UGRGB(255,0,0)); + 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)); @@ -1191,16 +1386,16 @@ void MainWindow::loadModelData() 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); +// 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); +// 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(); @@ -1295,8 +1490,10 @@ void MainWindow::loadModelData() // 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); @@ -1309,14 +1506,14 @@ void MainWindow::loadModelData() // pl->SetName(_U("Test")); // pl->SetGeometry(model); - UGStyle3D sty3D; +// UGStyle3D sty3D; // sty3D.SetMarkerStyle(318); //253268 //// sty3D.SetMarker3D(true); - sty3D.SetPointColor(UGRGB(255,0,0)); - sty3D.SetMarkerSize(30); +// sty3D.SetPointColor(UGRGB(255,0,0)); +// sty3D.SetMarkerSize(30); // sty3D.SetFill3DMode(UGC::/*UGFill3DMode::*/FILL_FACE); - sty3D.SetAltitudeMode(AltitudeMode::Absolute); - sty3D.SetBottomAltitude(20); +// sty3D.SetAltitudeMode(AltitudeMode::Absolute); +// sty3D.SetBottomAltitude(20); // p->SetStyle3D(&sty3D); // pl->SetStyle3D(&sty3D); // plotLayer->Add(p,_U("point")); @@ -1353,12 +1550,15 @@ void MainWindow::loadModelData() // UGGeoPicture* pt = (UGGeoPicture*) geometry; // UGGeoLine3D* l = (UGGeoLine3D*) geometry; // l->SetStyle3D(&style3D); - UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D(); +// UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D(); // trackingLayer3D->SetAlwaysRender(true); // trackingLayer3D->SetWorkspace(m_pWorkspace); // trackingLayer3D->SetUseGeoStyle(true); // qDebug()<<"**************TrackingCount0:"<GetCount(); -// trackingLayer3D->Add(GP,_U("picture")); +// trackingLayer3D->Add(l,_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); @@ -1392,9 +1592,9 @@ void MainWindow::loadModelData() // qDebug()<<"**************RenderObjectSize1:"<GetSize(); // UGRenderObject* ro = trackingLayer3D->GetAt(0); // qDebug()<<"**************RenderObjectVisible:"<IsVisible(); - pSceneControl->Refresh(); +// pSceneControl->Refresh(); // scene->UpdateData(); - scene->Refresh(); +// scene->Refresh(); // pSceneControl->GetScene3D()->GetCamera(_U("Camera"))->FlyTo(model); // pSceneControl->GetScene3D()->Refresh(); @@ -1445,33 +1645,7 @@ void MainWindow::showOnlineMapDialog() void MainWindow::showAttributeMenu() { rMenuType = RBtnMenuType::AttributeMenu; - connect(actionExportFile,&QAction::triggered,this,[=](){ - QString savePath = QFileDialog::getSaveFileName(this, tr("导出KML文件"), - "/航线1", - tr("Google KML(*.kml);;Google KML(*.kmz)")); - if(savePath.isEmpty()) return; - - UGMap* pMap = qMapControl->GetMap(); - LayerOperator layerOpt; - QMap featureInfo; - featureInfo = layerOpt.getSelectedFeature(pMap); - //构造SQL查询条件 - QStringList filterlist; - QList 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; - GeoFP.exportKMLData(ds,"FlightLines",savePath,filter); -// qDebug()<<"****************Succes:"<exec(QCursor::pos()); rMenuType = RBtnMenuType::DefaultMenu; } @@ -1837,6 +2011,37 @@ void MainWindow::showSaveRoute3DDialog(UGGeometry* pGeometry) dv = NULL; } +//高亮当前导入的KML 3D几何对象 +void MainWindow::highLightKMLGeometry(int currentGeometryID, int lastGeometryID) +{ + UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D(); + qDebug()<<"********************currentGeometryID:"<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:"<GetStyle3D()->GetLineColor3D().r; +// qDebug()<<"********************g:"<GetStyle3D()->GetLineColor3D().g; +// qDebug()<<"********************b:"<GetStyle3D()->GetLineColor3D().b; +// qDebug()<<"********************Type:"<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) { @@ -1847,6 +2052,7 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event) if(rMenuType==RBtnMenuType::DefaultMenu && mapType == MapType::Map3D) { + /* UGCameraWorld* camera = pSceneControl->GetScene3D()->GetCamera(_U("Camera")); UGCameraState cs = camera->m_StateCamera; pSceneControl->GetCameraWorld()->GetCamera(cs); @@ -1878,6 +2084,7 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event) qDebug()<<"*************q.y:"<GetSceneEditWnd()->GetUserAction() != 105) return; @@ -1977,13 +2184,19 @@ void MainWindow::viewEntire() //平移浏览地图操作 void MainWindow::pan() { - qMapControl->Pan(); + if(mapType==MapType::Map2D) + qMapControl->Pan(); + else if(mapType==MapType::Map3D) + pSceneControl->Pan(); } //选择要素操作 void MainWindow::Select() { - qMapControl->Select(); + if(mapType==MapType::Map2D) + qMapControl->Select(); + else if(mapType==MapType::Map3D) + pSceneControl->Select(); } #pragma endregion } @@ -2057,12 +2270,6 @@ void MainWindow::drawPoint() //绘制线 void MainWindow::drawLine() { -// int count = pSceneControl->GetSceneEditWnd()->GetScene3D()->m_Layers.GetInnerCount(); -// for(int n=0;nGetSceneEditWnd()->GetScene3D()->m_Layers.GetLayerInnerAt(n)->GetName()); -// } - //获取数据源 UGDataSource* ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName)); diff --git a/mainwindow.h b/mainwindow.h index 04ed6500..5351ad8f 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -95,7 +95,11 @@ private: UGbool DirExist(QString fullPath); //判断文件夹是否存在 - void importKMLData(); //导入KML + void importKMLData(); //导入KML,仅用于二维地图 + + void importKML3DData(); //导入KML,仅用于三维地图 + + void exportKMLFile(); //导出KML文件 //加载模型文件 void loadModelData(); @@ -246,5 +250,7 @@ public slots: void showSaveRoute3DDialog(UGGeometry* pGeometry); //显示三维航线保存对话框 + void highLightKMLGeometry(int currentGeometryID,int lastGeometryID); //高亮当前导入的KML 3D几何对象 + }; #endif // MAINWINDOW_H diff --git a/routeglobalvariant.cpp b/routeglobalvariant.cpp index 210ca387..2a79ced3 100644 --- a/routeglobalvariant.cpp +++ b/routeglobalvariant.cpp @@ -40,6 +40,22 @@ UGStyle3D RouteGlobalVariant::getRouteStyle3D(int routeType) return style3D; } +void RouteGlobalVariant::getTemporaryStyle3D(UGStyle3D &temporaryStyle) +{ + temporaryStyle.SetLineStyle(6); + temporaryStyle.SetLineColor3D(UGRGB(255,255,255)); + temporaryStyle.SetLineWidth(1); + temporaryStyle.SetAltitudeMode(AltitudeMode::Absolute); +} + +void RouteGlobalVariant::getHighLightStyle3D(UGStyle3D &highLightStyle) +{ + highLightStyle.SetLineStyle(6); + highLightStyle.SetLineColor3D(UGRGB(0,0,255)); + highLightStyle.SetLineWidth(1); + highLightStyle.SetAltitudeMode(AltitudeMode::Absolute); +} + //获取航线类型 QMap RouteGlobalVariant::getRouteType() { @@ -66,28 +82,4 @@ UGColor RouteGlobalVariant::getRouteTypeColor(int Type) colors[6] = UGRGB(152,78,163); //跑道航线 return colors[Type]; - /* - switch (Type) { - case 1: - return colors[1]; - break; - case 2: - return colors[2]; - break; - case 3: - return colors[3]; - break; - case 4: - return colors[4]; - break; - case 5: - return colors[5]; - break; - case 6: - return colors[6]; - break; - default: - break; - } - */ } diff --git a/routeglobalvariant.h b/routeglobalvariant.h index 729c9b12..e0215b52 100644 --- a/routeglobalvariant.h +++ b/routeglobalvariant.h @@ -42,6 +42,10 @@ public: UGStyle3D getRouteStyle3D(int routeType); + void getTemporaryStyle3D(UGStyle3D &temporaryStyle); //获取临时显示风格 + + void getHighLightStyle3D(UGStyle3D &highLightStyle); //获取高亮风格 + QMap getRouteType(); // 获取航线类型 UGColor getRouteTypeColor(int Type); //获取航线颜色 diff --git a/scenecontrol.cpp b/scenecontrol.cpp index 9632f212..12af59e8 100644 --- a/scenecontrol.cpp +++ b/scenecontrol.cpp @@ -279,7 +279,7 @@ void SceneControl::Refresh() pLayer->SetInitialized(false); pLayers->RefreshRasterLayer(pLayer); } - + pLayers = NULL; } void SceneControl::Refresh(UGLayer3D *pLayer) @@ -287,6 +287,8 @@ void SceneControl::Refresh(UGLayer3D *pLayer) UGLayer3Ds* pLayers = GetUGLayer3Ds(); pLayer->SetInitialized(false); pLayers->RefreshRasterLayer(pLayer); + + pLayers = NULL; } void SceneControl::RenderInTimer() { @@ -610,43 +612,46 @@ UGArray* SceneControl::GetGeoSelections() } pSelectionArr->Add(pSelection); } + pLayer = NULL; + pSelection = NULL; } - + pLayers = NULL; return pSelectionArr; } -UGRecordset* SceneControl::ToRecordset(UGSelection3D* pSelection, bool isEditable /*= false*/) +UGRecordsetPtr SceneControl::ToRecordset(UGSelection3D* pSelection, bool isEditable /*= false*/) { - UGRecordset* pRecordset = NULL; + UGRecordsetPtr pRecordset = NULL; if (NULL != pSelection && pSelection->GetSize() > 0) { UGLayer3D* pLayer = pSelection->GetLayer3D(); - UGDatasetVector* pDataset = NULL; +// UGDatasetVector* pDataset = NULL; + UGDatasetPtr pDataset = NULL; UGLayer::UGLayerType type = (UGLayer::UGLayerType)pLayer->GetType(); switch (type) { case UGC::/*UGLayer3DType::*/l3dDatasetVector: { UGLayer3DDatasetVector* pLayer3DDatasetVector = (UGLayer3DDatasetVector*)(pLayer); - pDataset = (UGDatasetVector*)pLayer3DDatasetVector->GetDataset().get(); + pDataset = pLayer3DDatasetVector->GetDataset(); break; } case UGC::/*UGLayer3DType::*/l3dDatasetModelPro: { UGLayer3DDatasetModelPro* pLayer3DDatasetModel = (UGLayer3DDatasetModelPro*)(pLayer); - pDataset = (UGDatasetVector*)pLayer3DDatasetModel->GetDataset().get(); + pDataset = pLayer3DDatasetModel->GetDataset(); break; } case UGC::/*UGLayer3DType::*/l3dDatasetVectorPoint: { UGLayer3DDatasetVectorPoint* pLayer3DDatasetPoint = (UGLayer3DDatasetVectorPoint*)(pLayer); - pDataset = (UGDatasetVector*)pLayer3DDatasetPoint->GetDataset().get(); + pDataset = pLayer3DDatasetPoint->GetDataset(); break; } case UGC::/*UGLayer3DType::*/l3dDatasetVectorLR: { UGLayer3DDatasetVectorLR* pLayer3DDatasetRegion = (UGLayer3DDatasetVectorLR*)(pLayer); - pDataset = (UGDatasetVector*)pLayer3DDatasetRegion->GetDataset().get(); + pDataset = pLayer3DDatasetRegion->GetDataset(); break; } @@ -692,11 +697,12 @@ UGRecordset* SceneControl::ToRecordset(UGSelection3D* pSelection, bool isEditabl queryDef.m_nMode = UGQueryDef::GeneralQuery; queryDef.m_nCursorType = UGQueryDef::OpenDynamic; // OpenStatic, 用于读取数据;OpenDynamic, 用于数据增删改 + UGDatasetVector* dv = (UGDatasetVector*)pDataset.get(); UGFieldInfos fieldInfos; - pDataset->GetFieldInfos(fieldInfos); // 获取字段信息,可用来添加或删除非系统字段,只是用于查找字段值,也可通过UGRecordset获取 - int countOld = pDataset->GetRecordsetCount(); + dv->GetFieldInfos(fieldInfos); // 获取字段信息,可用来添加或删除非系统字段,只是用于查找字段值,也可通过UGRecordset获取 + int countOld = dv->GetRecordsetCount(); - pRecordset = pDataset->Query(queryDef).get(); + pRecordset = dv->Query(queryDef); } } @@ -898,7 +904,10 @@ void SceneControl::ZoomFree() void SceneControl::Select() { - m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaPointSelect); +// m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaPointSelect); +// m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaRectSelect); + m_pUGSceneWnd->SetUserAction(UGSceneUserAction::suaPointSelect); +// qDebug()<<"*********************:"<GetUserAction(); } void SceneControl::ViewEntire() diff --git a/scenecontrol.h b/scenecontrol.h index 16e1b0d5..8e16f593 100644 --- a/scenecontrol.h +++ b/scenecontrol.h @@ -266,7 +266,7 @@ using namespace UGC; * @pSelection 用于获得记录集的UGSelection3D* * @isEditable 返回的记录集是否可修改,默认false, 不可修改记录。 */ - UGRecordset* ToRecordset(UGSelection3D* pSelection, bool isEditable=false); + UGRecordsetPtr ToRecordset(UGSelection3D* pSelection, bool isEditable=false); // 全幅显示指定图层 void ViewToLayer(UGLayer3D* pLayer); diff --git a/sceneview.cpp b/sceneview.cpp index db1fa991..b5c61f39 100644 --- a/sceneview.cpp +++ b/sceneview.cpp @@ -181,6 +181,11 @@ void SceneView::mouseReleaseEvent(QMouseEvent* event) else if (event->button() == Qt::RightButton) {// RightButton m_pSceneControl->OnRMouseUp(flag, event->x(), event->y()); + if(m_pSceneControl->GetGeoSelections()!=NULL) + {//当前有选中状态,则右键弹出属性菜单 +// qDebug()<<"********************右键菜单被调用了"; + emit showAttributeMenu(); + } } else if (event->button() == Qt::MidButton) {// MidButton diff --git a/sceneview.h b/sceneview.h index a1a833e1..9de5610b 100644 --- a/sceneview.h +++ b/sceneview.h @@ -68,6 +68,7 @@ signals: void sendTrackedGeometry(UGGeometry* pGeometry); //发送绘制完的3D几何对象信号 void sendTrackingGeometry(UGGeometry* pGeometry); void showSettingFlightPointDialg(); //显示航点信息信号 + void showAttributeMenu(); //显示右键属性菜单 public slots: void RenderInTimer();