From bd31a1b030da949ff20a5d17a63c8cce65644774 Mon Sep 17 00:00:00 2001 From: cbwu Date: Tue, 20 Jun 2023 15:30:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=89=E7=BB=B4=E8=88=AA?= =?UTF-8?q?=E7=BA=BF=E6=97=B6=EF=BC=8C=E6=B7=BB=E5=8A=A0=E8=88=AA=E7=82=B9?= =?UTF-8?q?=E6=B3=A8=E8=AE=B0=E6=98=BE=E7=A4=BA=EF=BC=9B=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E8=88=AA=E7=BA=BF=E5=AF=B9=E8=AF=9D=E6=A1=86?= =?UTF-8?q?=E8=88=AA=E7=BA=BF=E7=B1=BB=E5=9E=8B=E9=80=89=E9=A1=B9=E6=A1=86?= =?UTF-8?q?=E6=BB=9A=E5=8A=A8=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- displayroutedialog.cpp | 13 +++- geofeatureoperator.cpp | 151 +++++++++++++++++++++++++++++++++++++++-- geofeatureoperator.h | 14 +++- mainwindow.cpp | 69 ++++++++++++------- routeglobalvariant.cpp | 19 +++++- routeglobalvariant.h | 6 ++ 6 files changed, 238 insertions(+), 34 deletions(-) diff --git a/displayroutedialog.cpp b/displayroutedialog.cpp index 8146cb11..bd828c5d 100644 --- a/displayroutedialog.cpp +++ b/displayroutedialog.cpp @@ -60,7 +60,8 @@ void DisplayRouteDialog::addRouteTypeItem() if(!res) return; res->MoveFirst(); UGVariant v; - QSet typeset; +// QSet typeset; + std::set typeset; while(!res->IsEOF()) {//获取航线类型唯一值 res->GetFieldValue(_U("RouteType"),v); @@ -221,19 +222,27 @@ void DisplayRouteDialog::showRoute3D() res->MoveFirst(); UGLayer3Ds* layers = pSceneControl->GetUGLayer3Ds(); + UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D(); //添加到显示数据集 UGString displayDtName = addGeometry3DToDisplayDataset(res,routeType.toInt()); UGString displayLayerName = displayDtName + _U("@") + routeGVar.workspaceDataName.DatasourceName; int index = layers->FindNameInner(displayLayerName); - if(index>=0) layers->TreeRemoveAt(index); //移除已存在的图层 + if(index>=0) + { + layers->TreeRemoveAt(index); //移除已存在的图层 + //移除航点注记 + trackingLayer3D->RemoveAll(); + } // UGLayer3D* displayLayer = pSceneControl->AddLayerFromDataset(routeGVar.workspaceDataName.DatasourceName,displayDtName); UGLayer3D* displayLayer = layers->AddLayer(displayLayerName); + gftOpt.addNodeLabel3D(res,trackingLayer3D);//添加航点注记 UGStyle3D style3D = routeGVar.getRouteStyle3D(routeType.toInt()); displayLayer->SetStyle3D(style3D); pSceneControl->Refresh(displayLayer); displayLayer = NULL; layers = NULL; + trackingLayer3D = NULL; /* TrackingLayer3D显示方式 UGTrackingLayer3D* pTrackingLayer3D = pSceneControl->GetTrackingLayer3D(); diff --git a/geofeatureoperator.cpp b/geofeatureoperator.cpp index ac69ab66..0d30fbce 100644 --- a/geofeatureoperator.cpp +++ b/geofeatureoperator.cpp @@ -1,9 +1,11 @@ #include "geofeatureoperator.h" #include "Engine/UGDataSource.h" #include "Geometry/UGGeoLine.h" +#include "Geometry3D/UGGeoPoint3D.h" #include "Map/UGMap.h" #include "MapEditor/UGMapEditorWnd.h" #include "qdebug.h" +#include "qvector3d.h" #include "routeglobalvariant.h" #include "translator.h" #include "layeroperator.h" @@ -202,7 +204,80 @@ int GeoFeatureOperator::importFeatureAttribute(UGDatasetVector *dv, UGGeometry* } -//获取几何对象所有节点坐标 +/*@获取几何对象所有节点坐标 + *@points 使用三维坐标存储航点 + *@altitude 用于兼容二维点,默认为0 + */ +void GeoFeatureOperator::getNodePoints(UGGeometry* pGeometry, QVector&points,double altitude) +{ + QVector3D point; + int type = pGeometry->GetType(); + switch (type) { + case UGGeometry::GeoLine: + { + UGGeoLine* line = (UGGeoLine*)pGeometry; + const UGPoint2D* p = line->GetPoints(); //节点指针 + int nodeNum = line->GetPointCount(); //节点数 + if (line->GetStartNode() == line->GetEndNode()) + {//闭合航线,减去末尾重合航点 + nodeNum--; + } + for(int i = 0;ix); + point.setY(p->y); + point.setZ(altitude); + points.append(point); + p++; + } + line = NULL; + p = NULL; + break; + } + case UGGeometry::GeoRegion: + { + UGGeoRegion* polygon = (UGGeoRegion*)pGeometry; + const UGPoint2D* p = polygon->GetPoints(); //节点指针 + int nodeNum = polygon->GetPointCount()-1; //节点数 + for(int i = 0;ix); + point.setY(p->y); + point.setZ(altitude); + points.append(point); + p++; + } + polygon = NULL; + p = NULL; + break; + } + case UGGeometry::GeoLine3D: + { + UGGeoLine3D* line3D = (UGGeoLine3D*)pGeometry; + const UGPoint3D* p = line3D->GetPoints(); //节点指针 + int nodeNum = line3D->GetPointCount(); //节点数 + if (line3D->GetStartNode() == line3D->GetEndNode()) + {//闭合航线,减去末尾重合航点 + nodeNum--; + } + for(int i = 0;ix); + point.setY(p->y); + point.setZ(p->z); + points.append(point); + p++; + } + + line3D = NULL; + p = NULL; + break; + } + } +} + +//获取几何对象所有节点坐标(废弃) +/* void GeoFeatureOperator::getNodePoints(UGRecordsetPtr res, UGint geometryType, QVector &points) { res->MoveFirst(); //确保记录集指针是链表表头 @@ -250,7 +325,7 @@ void GeoFeatureOperator::getNodePoints(UGRecordsetPtr res, UGint geometryType, Q } } } - +*/ //线要素绘制 void GeoFeatureOperator::drawLine(QMapControl *qMapControl, UGDataSource *pDataSource, UGString datasetName) @@ -289,7 +364,7 @@ void GeoFeatureOperator::drawLine(QMapControl *qMapControl, UGDataSource *pDataS lineLayer = NULL; } -//3D线要素绘制 +//3D线要素绘制(废弃) void GeoFeatureOperator::drawLine3D(SceneView* pSceneView, UGString datasourceName, UGString datasetName) { SceneControl* pSceneControl = pSceneView->GetSceneControl(); @@ -330,7 +405,7 @@ void GeoFeatureOperator::drawLine3D(SceneView* pSceneView, UGString datasourceNa pSceneControl = NULL; } - +//3D线要素绘制 void GeoFeatureOperator::drawLine3D(SceneView *pSceneView, UGString dataName) { SceneControl* pSceneControl = pSceneView->GetSceneControl(); @@ -373,10 +448,10 @@ void GeoFeatureOperator::drawLine3D(SceneView *pSceneView, UGString dataName) pSceneView->isEditStateFlag = true; //显示对话框 -// emit pSceneView->showSettingFlightPointDialg(); + emit pSceneView->showSettingFlightPointDialg(); - qDebug()<<"*******************Cursor:"<GetSceneEditWnd()->Get3DCursorShape(); - qDebug()<<"*******************Cursor:"<GetSceneEditWnd()->m_SceneWindow.m_n3DCursorShape; +// qDebug()<<"*******************Cursor:"<GetSceneEditWnd()->Get3DCursorShape(); +// qDebug()<<"*******************Cursor:"<GetSceneEditWnd()->m_SceneWindow.m_n3DCursorShape; // dv = NULL; lineLayer3D = NULL; @@ -384,6 +459,56 @@ void GeoFeatureOperator::drawLine3D(SceneView *pSceneView, UGString dataName) pLayer3Ds = NULL; } +//添加三维航点注记 +void GeoFeatureOperator::addNodeLabel3D(UGRecordsetPtr res, UGTrackingLayer3D *pTrackingLayer3D) +{ +// QMap points; +// getNodePoints(res,points); + UGGeometry* pGeometry = NULL; + UGGeoLine3D* line3D = NULL; + UGPoint3D point; + UGString nodeTag; + UGVariant v; + res->MoveFirst(); + while(!res->IsEOF()) + { + res->GetGeometry(pGeometry); + res->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteType),v); + int type = v.ToInt(); + res->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteNumber),v); + UGString number = v.ToString(); + + line3D = (UGGeoLine3D*)pGeometry; + int nodeCount = line3D->GetPointCount(); + const UGPoint3D* points3D = line3D->GetPoints(); + if(line3D->GetStartNode()==line3D->GetEndNode()) + nodeCount--; + UGGeoText3D* geoText3D = new UGGeoText3D(); + UGStyle3D style; + style.SetAltitudeMode(AltitudeMode::Absolute); + geoText3D->SetStyle3D(&style); + UGTextStyle textStyle = routeGVar.getLabelTextStyle(type); + geoText3D->SetTextStyle(textStyle); + for(int i = 0;ix; + point.y = points3D->y; + point.z = points3D->z; + geoText3D->AddSub(nodeTag,point); + points3D++; + } + + UGString geoTextTag = Translator::QStr2UGStr(QString::number(type)) + _U("_") + number; + pTrackingLayer3D->Add(geoText3D,geoTextTag); + + res->MoveNext(); + geoText3D = NULL; + } + pGeometry = NULL; + line3D = NULL; +} + //添加三维几何对象到记录集 void GeoFeatureOperator::addGeometry3DToDataset(UGDatasetVector *dv, UGGeometry *pGeometry) { @@ -487,3 +612,15 @@ int GeoFeatureOperator::importGeometry3DAttribute(UGDatasetVector *dv, UGGeometr return 2; } } + +//创建三维地标对象 +UGGeoPlacemark *GeoFeatureOperator::createGeoPlacemark(QVector3D point, QString strName) +{ + UGGeoPlacemark* geoPlacemark = new UGGeoPlacemark(); + UGGeoPoint3D* point3D = new UGGeoPoint3D(); + geoPlacemark->SetGeometry(point3D); + geoPlacemark->SetPosition(UGPoint3D(point.x(),point.y(),point.z())); + geoPlacemark->SetName(Translator::QStr2UGStr(strName)); + + return geoPlacemark; +} diff --git a/geofeatureoperator.h b/geofeatureoperator.h index 24353ea8..6c5b6e89 100644 --- a/geofeatureoperator.h +++ b/geofeatureoperator.h @@ -10,6 +10,9 @@ #include "qmapcontrol.h" #include "scenecontrol.h" #include "sceneview.h" +#include "routeglobalvariant.h" +#include "Geometry3D/UGGeoPlacemark.h" +#include "Scene/UGTrackingLayer3D.h" using namespace UGC; @@ -29,7 +32,8 @@ public: int importFeatureAttribute(UGDatasetVector *dv, UGGeometry* pGeometry, QMap fieldsValue,bool isAddGeometry = true); //获取几何对象所有节点坐标 - void getNodePoints(UGRecordsetPtr res,UGint geometryType,QVector&points); +// void getNodePoints(UGRecordsetPtr res,UGint geometryType,QVector&points); + void getNodePoints(UGGeometry* pGeometry, QVector&points,double altitude=0); //线要素绘制 void drawLine(QMapControl* qMapControl,UGDataSource* pDataSource,UGString datasetName); @@ -39,11 +43,19 @@ public: void drawLine3D(SceneView* pSceneView,UGString dataName); + //添加三维航点注记 + void addNodeLabel3D(UGRecordsetPtr res,UGTrackingLayer3D* pTrackingLayer3D); + //添加三维几何对象到记录集 void addGeometry3DToDataset(UGDatasetVector* dv,UGGeometry* pGeometry); //添加三维几何对象 int importGeometry3DAttribute(UGDatasetVector *dv, UGGeometry* pGeometry, QMap fieldsValue); + + //创建三维地标对象 + UGGeoPlacemark* createGeoPlacemark(QVector3D point,QString strName); +private: + RouteGlobalVariant routeGVar; }; #endif // GEOFEATUREOPERATOR_H diff --git a/mainwindow.cpp b/mainwindow.cpp index 92a73350..e74060f3 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -54,6 +54,7 @@ #include "Base3D/UGBoundingBox.h" #include "Geometry/UGGeoPicture.h" #include "Geometry3D/UGGeoPlacemark.h" +#include "Geometry3D/UGGeoBillboard.h" #include "Geometry3D/UGGeoLine3D.h" #include "GeometryPlot/UGGOLibraryManager.h" @@ -1277,18 +1278,18 @@ void MainWindow::loadModelData() // pDataSource = NULL; //模型移动测试 - UGDatasetVector* dv = (UGDatasetVector*)pDataSource->GetDataset(_U("Plane")).get(); //Plane +// 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:"<GetRecordCount(); - UGGeometry* geometry = NULL; - res->GetGeometry(geometry); //geometryType: GeoModelPro +// if(!dv->IsOpen()) dv->Open(); +// UGQueryDef query; +// UGRecordsetPtr res = dv->Query(query); +// res->MoveFirst(); +// qDebug()<<"*****************RecordCount:"<GetRecordCount(); +// UGGeometry* geometry = NULL; +// res->GetGeometry(geometry); //geometryType: GeoModelPro // qDebug()<<"*************geometryType:"<GetType(); // UGRect2D rec = geometry->GetBounds(); // qDebug()<<"*************leftX:"<GetType(); // res->Edit(); - UGGeoModelPro* model = (UGGeoModelPro*)geometry; - model->SetPosition(UGPoint3D(119.73,32.234539,25)); +// UGGeoModelPro* model = (UGGeoModelPro*)geometry; +// model->SetPosition(UGPoint3D(119.73,32.234539,25)); // res->SetGeometry(*model); // res->Update(); // model->SetStyle3D(&tmpSty); @@ -1409,22 +1410,44 @@ void MainWindow::loadModelData() // 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); +// UGGeoPlacemark* GP = new UGGeoPlacemark(); + UGGeoPoint3D* p = new UGGeoPoint3D(); + p->SetX(119.718567); + p->SetY(32.234317); + p->SetZ(20); // GP->MakeWithGeometry(p); - GP->SetGeometry(model); - GP->SetPosition(UGPoint3D(119.718567,32.234317,20)); - GP->SetName(_U("Test")); +// GP->SetGeometry(p); +// GP->SetPosition(UGPoint3D(119.718567,32.234317,20)); +// GP->SetName(_U("Test")); // UGStyle3D s; // s.SetAltitudeMode(AltitudeMode::Absolute); - UGTextStyle t; - t.SetSize(64); - GP->SetNameTextStyle(&t); - pSceneControl->GetTrackingLayer3D()->Add(GP,_U("a")); - +// 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; diff --git a/routeglobalvariant.cpp b/routeglobalvariant.cpp index 2a79ced3..66b4686e 100644 --- a/routeglobalvariant.cpp +++ b/routeglobalvariant.cpp @@ -26,7 +26,7 @@ UGStyle RouteGlobalVariant::getRouteStyle(int routeType) UGStyle style; style.SetLineWidth(1); style.SetLineColor(getRouteTypeColor(routeType)); - +// style.SetLineCapStyle(1); return style; } //获取航线类型的Style3D @@ -35,6 +35,7 @@ UGStyle3D RouteGlobalVariant::getRouteStyle3D(int routeType) UGStyle3D style3D; style3D.SetLineColor3D(getRouteTypeColor(routeType)); style3D.SetLineWidth(2); +// style3D.SetLineCapStyle(0); style3D.SetAltitudeMode(AltitudeMode::Absolute); return style3D; @@ -83,3 +84,19 @@ UGColor RouteGlobalVariant::getRouteTypeColor(int Type) return colors[Type]; } + +//获取注记Style +UGTextStyle RouteGlobalVariant::getLabelTextStyle(int routeType) +{ + UGTextStyle textStyle; + textStyle.SetSize(16); + textStyle.SetForeColor(getRouteTypeColor(routeType)); + return textStyle; +} + +UGTextStyle3D RouteGlobalVariant::getLabelTextStyle3D() +{ + UGTextStyle3D textStyle3D; + textStyle3D.m_dScale = 2; + return textStyle3D; +} diff --git a/routeglobalvariant.h b/routeglobalvariant.h index e0215b52..11295eb5 100644 --- a/routeglobalvariant.h +++ b/routeglobalvariant.h @@ -2,9 +2,11 @@ #define ROUTEGLOBALVARIANT_H #include "Base3D/UGStyle3D.h" +#include "Toolkit/UGTextStyle.h" #include #include #include +#include "Base3D/UGTextStyle3D.h" using namespace UGC; @@ -50,6 +52,10 @@ public: UGColor getRouteTypeColor(int Type); //获取航线颜色 + UGTextStyle getLabelTextStyle(int routeType=1);//获取注记Style + + UGTextStyle3D getLabelTextStyle3D();//获取注记Style3D + public: // QMap RouteType; //航线类型