显示三维航线时,添加航点注记显示;修复显示航线对话框航线类型选项框滚动显示问题。

master
cbwu 2 years ago
parent 307c030a7d
commit bd31a1b030

@ -60,7 +60,8 @@ void DisplayRouteDialog::addRouteTypeItem()
if(!res) return; if(!res) return;
res->MoveFirst(); res->MoveFirst();
UGVariant v; UGVariant v;
QSet<int> typeset; // QSet<int> typeset;
std::set<int> typeset;
while(!res->IsEOF()) while(!res->IsEOF())
{//获取航线类型唯一值 {//获取航线类型唯一值
res->GetFieldValue(_U("RouteType"),v); res->GetFieldValue(_U("RouteType"),v);
@ -221,19 +222,27 @@ void DisplayRouteDialog::showRoute3D()
res->MoveFirst(); res->MoveFirst();
UGLayer3Ds* layers = pSceneControl->GetUGLayer3Ds(); UGLayer3Ds* layers = pSceneControl->GetUGLayer3Ds();
UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D();
//添加到显示数据集 //添加到显示数据集
UGString displayDtName = addGeometry3DToDisplayDataset(res,routeType.toInt()); UGString displayDtName = addGeometry3DToDisplayDataset(res,routeType.toInt());
UGString displayLayerName = displayDtName + _U("@") + routeGVar.workspaceDataName.DatasourceName; UGString displayLayerName = displayDtName + _U("@") + routeGVar.workspaceDataName.DatasourceName;
int index = layers->FindNameInner(displayLayerName); 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 = pSceneControl->AddLayerFromDataset(routeGVar.workspaceDataName.DatasourceName,displayDtName);
UGLayer3D* displayLayer = layers->AddLayer(displayLayerName); UGLayer3D* displayLayer = layers->AddLayer(displayLayerName);
gftOpt.addNodeLabel3D(res,trackingLayer3D);//添加航点注记
UGStyle3D style3D = routeGVar.getRouteStyle3D(routeType.toInt()); UGStyle3D style3D = routeGVar.getRouteStyle3D(routeType.toInt());
displayLayer->SetStyle3D(style3D); displayLayer->SetStyle3D(style3D);
pSceneControl->Refresh(displayLayer); pSceneControl->Refresh(displayLayer);
displayLayer = NULL; displayLayer = NULL;
layers = NULL; layers = NULL;
trackingLayer3D = NULL;
/* TrackingLayer3D显示方式 /* TrackingLayer3D显示方式
UGTrackingLayer3D* pTrackingLayer3D = pSceneControl->GetTrackingLayer3D(); UGTrackingLayer3D* pTrackingLayer3D = pSceneControl->GetTrackingLayer3D();

@ -1,9 +1,11 @@
#include "geofeatureoperator.h" #include "geofeatureoperator.h"
#include "Engine/UGDataSource.h" #include "Engine/UGDataSource.h"
#include "Geometry/UGGeoLine.h" #include "Geometry/UGGeoLine.h"
#include "Geometry3D/UGGeoPoint3D.h"
#include "Map/UGMap.h" #include "Map/UGMap.h"
#include "MapEditor/UGMapEditorWnd.h" #include "MapEditor/UGMapEditorWnd.h"
#include "qdebug.h" #include "qdebug.h"
#include "qvector3d.h"
#include "routeglobalvariant.h" #include "routeglobalvariant.h"
#include "translator.h" #include "translator.h"
#include "layeroperator.h" #include "layeroperator.h"
@ -202,7 +204,80 @@ int GeoFeatureOperator::importFeatureAttribute(UGDatasetVector *dv, UGGeometry*
} }
//获取几何对象所有节点坐标 /*@获取几何对象所有节点坐标
*@points 使
*@altitude 0
*/
void GeoFeatureOperator::getNodePoints(UGGeometry* pGeometry, QVector<QVector3D>&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;i<nodeNum;i++) //遍历一个要素所有节点
{
point.setX(p->x);
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;i<nodeNum;i++)
{
point.setX(p->x);
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;i<nodeNum;i++)
{
point.setX(p->x);
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<QPointF> &points) void GeoFeatureOperator::getNodePoints(UGRecordsetPtr res, UGint geometryType, QVector<QPointF> &points)
{ {
res->MoveFirst(); //确保记录集指针是链表表头 res->MoveFirst(); //确保记录集指针是链表表头
@ -250,7 +325,7 @@ void GeoFeatureOperator::getNodePoints(UGRecordsetPtr res, UGint geometryType, Q
} }
} }
} }
*/
//线要素绘制 //线要素绘制
void GeoFeatureOperator::drawLine(QMapControl *qMapControl, UGDataSource *pDataSource, UGString datasetName) void GeoFeatureOperator::drawLine(QMapControl *qMapControl, UGDataSource *pDataSource, UGString datasetName)
@ -289,7 +364,7 @@ void GeoFeatureOperator::drawLine(QMapControl *qMapControl, UGDataSource *pDataS
lineLayer = NULL; lineLayer = NULL;
} }
//3D线要素绘制 //3D线要素绘制(废弃)
void GeoFeatureOperator::drawLine3D(SceneView* pSceneView, UGString datasourceName, UGString datasetName) void GeoFeatureOperator::drawLine3D(SceneView* pSceneView, UGString datasourceName, UGString datasetName)
{ {
SceneControl* pSceneControl = pSceneView->GetSceneControl(); SceneControl* pSceneControl = pSceneView->GetSceneControl();
@ -330,7 +405,7 @@ void GeoFeatureOperator::drawLine3D(SceneView* pSceneView, UGString datasourceNa
pSceneControl = NULL; pSceneControl = NULL;
} }
//3D线要素绘制
void GeoFeatureOperator::drawLine3D(SceneView *pSceneView, UGString dataName) void GeoFeatureOperator::drawLine3D(SceneView *pSceneView, UGString dataName)
{ {
SceneControl* pSceneControl = pSceneView->GetSceneControl(); SceneControl* pSceneControl = pSceneView->GetSceneControl();
@ -373,10 +448,10 @@ void GeoFeatureOperator::drawLine3D(SceneView *pSceneView, UGString dataName)
pSceneView->isEditStateFlag = true; pSceneView->isEditStateFlag = true;
//显示对话框 //显示对话框
// emit pSceneView->showSettingFlightPointDialg(); emit pSceneView->showSettingFlightPointDialg();
qDebug()<<"*******************Cursor:"<<pSceneControl->GetSceneEditWnd()->Get3DCursorShape(); // qDebug()<<"*******************Cursor:"<<pSceneControl->GetSceneEditWnd()->Get3DCursorShape();
qDebug()<<"*******************Cursor:"<<pSceneControl->GetSceneEditWnd()->m_SceneWindow.m_n3DCursorShape; // qDebug()<<"*******************Cursor:"<<pSceneControl->GetSceneEditWnd()->m_SceneWindow.m_n3DCursorShape;
// dv = NULL; // dv = NULL;
lineLayer3D = NULL; lineLayer3D = NULL;
@ -384,6 +459,56 @@ void GeoFeatureOperator::drawLine3D(SceneView *pSceneView, UGString dataName)
pLayer3Ds = NULL; pLayer3Ds = NULL;
} }
//添加三维航点注记
void GeoFeatureOperator::addNodeLabel3D(UGRecordsetPtr res, UGTrackingLayer3D *pTrackingLayer3D)
{
// QMap<int, QVector3D> 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;i<nodeCount;i++)
{
nodeTag = number + _U("-") + Translator::QStr2UGStr(QString::number(i+1));
point.x = points3D->x;
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) void GeoFeatureOperator::addGeometry3DToDataset(UGDatasetVector *dv, UGGeometry *pGeometry)
{ {
@ -487,3 +612,15 @@ int GeoFeatureOperator::importGeometry3DAttribute(UGDatasetVector *dv, UGGeometr
return 2; 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;
}

@ -10,6 +10,9 @@
#include "qmapcontrol.h" #include "qmapcontrol.h"
#include "scenecontrol.h" #include "scenecontrol.h"
#include "sceneview.h" #include "sceneview.h"
#include "routeglobalvariant.h"
#include "Geometry3D/UGGeoPlacemark.h"
#include "Scene/UGTrackingLayer3D.h"
using namespace UGC; using namespace UGC;
@ -29,7 +32,8 @@ public:
int importFeatureAttribute(UGDatasetVector *dv, UGGeometry* pGeometry, QMap<QString,QString> fieldsValue,bool isAddGeometry = true); int importFeatureAttribute(UGDatasetVector *dv, UGGeometry* pGeometry, QMap<QString,QString> fieldsValue,bool isAddGeometry = true);
//获取几何对象所有节点坐标 //获取几何对象所有节点坐标
void getNodePoints(UGRecordsetPtr res,UGint geometryType,QVector<QPointF>&points); // void getNodePoints(UGRecordsetPtr res,UGint geometryType,QVector<QPointF>&points);
void getNodePoints(UGGeometry* pGeometry, QVector<QVector3D>&points,double altitude=0);
//线要素绘制 //线要素绘制
void drawLine(QMapControl* qMapControl,UGDataSource* pDataSource,UGString datasetName); void drawLine(QMapControl* qMapControl,UGDataSource* pDataSource,UGString datasetName);
@ -39,11 +43,19 @@ public:
void drawLine3D(SceneView* pSceneView,UGString dataName); void drawLine3D(SceneView* pSceneView,UGString dataName);
//添加三维航点注记
void addNodeLabel3D(UGRecordsetPtr res,UGTrackingLayer3D* pTrackingLayer3D);
//添加三维几何对象到记录集 //添加三维几何对象到记录集
void addGeometry3DToDataset(UGDatasetVector* dv,UGGeometry* pGeometry); void addGeometry3DToDataset(UGDatasetVector* dv,UGGeometry* pGeometry);
//添加三维几何对象 //添加三维几何对象
int importGeometry3DAttribute(UGDatasetVector *dv, UGGeometry* pGeometry, QMap<QString,QString> fieldsValue); int importGeometry3DAttribute(UGDatasetVector *dv, UGGeometry* pGeometry, QMap<QString,QString> fieldsValue);
//创建三维地标对象
UGGeoPlacemark* createGeoPlacemark(QVector3D point,QString strName);
private:
RouteGlobalVariant routeGVar;
}; };
#endif // GEOFEATUREOPERATOR_H #endif // GEOFEATUREOPERATOR_H

@ -54,6 +54,7 @@
#include "Base3D/UGBoundingBox.h" #include "Base3D/UGBoundingBox.h"
#include "Geometry/UGGeoPicture.h" #include "Geometry/UGGeoPicture.h"
#include "Geometry3D/UGGeoPlacemark.h" #include "Geometry3D/UGGeoPlacemark.h"
#include "Geometry3D/UGGeoBillboard.h"
#include "Geometry3D/UGGeoLine3D.h" #include "Geometry3D/UGGeoLine3D.h"
#include "GeometryPlot/UGGOLibraryManager.h" #include "GeometryPlot/UGGOLibraryManager.h"
@ -1277,18 +1278,18 @@ void MainWindow::loadModelData()
// pDataSource = NULL; // 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); // ShowPlane3D* plane3D = new ShowPlane3D(pSceneControl,dv);
// plane3D->setPlanesCount(1); // plane3D->setPlanesCount(1);
// plane3D->startFly(); // plane3D->startFly();
if(!dv->IsOpen()) dv->Open(); // if(!dv->IsOpen()) dv->Open();
UGQueryDef query; // UGQueryDef query;
UGRecordsetPtr res = dv->Query(query); // UGRecordsetPtr res = dv->Query(query);
res->MoveFirst(); // res->MoveFirst();
qDebug()<<"*****************RecordCount:"<<res->GetRecordCount(); // qDebug()<<"*****************RecordCount:"<<res->GetRecordCount();
UGGeometry* geometry = NULL; // UGGeometry* geometry = NULL;
res->GetGeometry(geometry); //geometryType: GeoModelPro // res->GetGeometry(geometry); //geometryType: GeoModelPro
// qDebug()<<"*************geometryType:"<<geometry->GetType(); // qDebug()<<"*************geometryType:"<<geometry->GetType();
// UGRect2D rec = geometry->GetBounds(); // UGRect2D rec = geometry->GetBounds();
// qDebug()<<"*************leftX:"<<rec.BottomLeft().x; // qDebug()<<"*************leftX:"<<rec.BottomLeft().x;
@ -1337,8 +1338,8 @@ void MainWindow::loadModelData()
//// qDebug()<<"********************Type:"<<geometry->GetType(); //// qDebug()<<"********************Type:"<<geometry->GetType();
// res->Edit(); // res->Edit();
UGGeoModelPro* model = (UGGeoModelPro*)geometry; // UGGeoModelPro* model = (UGGeoModelPro*)geometry;
model->SetPosition(UGPoint3D(119.73,32.234539,25)); // model->SetPosition(UGPoint3D(119.73,32.234539,25));
// res->SetGeometry(*model); // res->SetGeometry(*model);
// res->Update(); // res->Update();
// model->SetStyle3D(&tmpSty); // model->SetStyle3D(&tmpSty);
@ -1409,22 +1410,44 @@ void MainWindow::loadModelData()
// kmlLayer->SetEditable(true); // kmlLayer->SetEditable(true);
// UGLayer3DModel* modelLayer3D = (UGLayer3DModel*)kmlLayer; // UGLayer3DModel* modelLayer3D = (UGLayer3DModel*)kmlLayer;
UGGeoPlacemark* GP = new UGGeoPlacemark(); // UGGeoPlacemark* GP = new UGGeoPlacemark();
// UGGeoPoint3D* p = new UGGeoPoint3D(); UGGeoPoint3D* p = new UGGeoPoint3D();
// p->SetX(119.718567); p->SetX(119.718567);
// p->SetY(32.234317); p->SetY(32.234317);
// p->SetZ(20); p->SetZ(20);
// GP->MakeWithGeometry(p); // GP->MakeWithGeometry(p);
GP->SetGeometry(model); // GP->SetGeometry(p);
GP->SetPosition(UGPoint3D(119.718567,32.234317,20)); // GP->SetPosition(UGPoint3D(119.718567,32.234317,20));
GP->SetName(_U("Test")); // GP->SetName(_U("Test"));
// UGStyle3D s; // UGStyle3D s;
// s.SetAltitudeMode(AltitudeMode::Absolute); // s.SetAltitudeMode(AltitudeMode::Absolute);
UGTextStyle t; // s.SetFill3DMode(UGC::/*UGFill3DMode::*/FILL_FACE);
t.SetSize(64); // s.SetPicturePath(_U("D:/Icon.png"));
GP->SetNameTextStyle(&t); // s.SetIconScale(5);
pSceneControl->GetTrackingLayer3D()->Add(GP,_U("a")); // 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); // modelLayer3D->AddModel(model);
// int layertype = UGLayer3DType::l3dTree; // int layertype = UGLayer3DType::l3dTree;

@ -26,7 +26,7 @@ UGStyle RouteGlobalVariant::getRouteStyle(int routeType)
UGStyle style; UGStyle style;
style.SetLineWidth(1); style.SetLineWidth(1);
style.SetLineColor(getRouteTypeColor(routeType)); style.SetLineColor(getRouteTypeColor(routeType));
// style.SetLineCapStyle(1);
return style; return style;
} }
//获取航线类型的Style3D //获取航线类型的Style3D
@ -35,6 +35,7 @@ UGStyle3D RouteGlobalVariant::getRouteStyle3D(int routeType)
UGStyle3D style3D; UGStyle3D style3D;
style3D.SetLineColor3D(getRouteTypeColor(routeType)); style3D.SetLineColor3D(getRouteTypeColor(routeType));
style3D.SetLineWidth(2); style3D.SetLineWidth(2);
// style3D.SetLineCapStyle(0);
style3D.SetAltitudeMode(AltitudeMode::Absolute); style3D.SetAltitudeMode(AltitudeMode::Absolute);
return style3D; return style3D;
@ -83,3 +84,19 @@ UGColor RouteGlobalVariant::getRouteTypeColor(int Type)
return colors[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;
}

@ -2,9 +2,11 @@
#define ROUTEGLOBALVARIANT_H #define ROUTEGLOBALVARIANT_H
#include "Base3D/UGStyle3D.h" #include "Base3D/UGStyle3D.h"
#include "Toolkit/UGTextStyle.h"
#include <QString> #include <QString>
#include <QMap> #include <QMap>
#include <Toolkit/UGStyle.h> #include <Toolkit/UGStyle.h>
#include "Base3D/UGTextStyle3D.h"
using namespace UGC; using namespace UGC;
@ -50,6 +52,10 @@ public:
UGColor getRouteTypeColor(int Type); //获取航线颜色 UGColor getRouteTypeColor(int Type); //获取航线颜色
UGTextStyle getLabelTextStyle(int routeType=1);//获取注记Style
UGTextStyle3D getLabelTextStyle3D();//获取注记Style3D
public: public:
// QMap<int,QString> RouteType; //航线类型 // QMap<int,QString> RouteType; //航线类型

Loading…
Cancel
Save