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.
174 lines
4.6 KiB
C++
174 lines
4.6 KiB
C++
#include "showplane3d.h"
|
|
#include "Geometry3D/UGGeoModelPro.h"
|
|
#include "Render/UGCameraGlobal.h"
|
|
#include <QDebug>
|
|
|
|
ShowPlane3D::ShowPlane3D(QObject *parent)
|
|
: QObject{parent}
|
|
{
|
|
|
|
}
|
|
|
|
ShowPlane3D::ShowPlane3D(SceneControl *m_pSceneControl,UGDatasetVector* dv)
|
|
{
|
|
this->m_pSceneControl = m_pSceneControl;
|
|
this->dv = dv;
|
|
this->n_planes = 1;
|
|
|
|
if(!dv->IsOpen()) dv->Open();
|
|
UGQueryDef query;
|
|
this->res = dv->Query(query);
|
|
|
|
//添加模型图层
|
|
UGLayer3Ds* layers = m_pSceneControl->GetUGLayer3Ds();
|
|
if(layers->FindNameInner(_U("Plane@Route"))<0)
|
|
planeLayer = layers->AddLayer(_U("Plane@Route"));
|
|
else
|
|
planeLayer = layers->GetLayerInner(_U("Plane@Route"));
|
|
|
|
UGGeometry* geometry = NULL;
|
|
this->res->GetGeometry(geometry);
|
|
m_pSceneControl->GetScene3D()->SetTrackingGeometry((UGGeometry3D*)geometry);
|
|
m_pSceneControl->GetScene3D()->SetTrackOffset(UGVector3d(0,0,30));
|
|
UGCameraGlobal* camera = (UGCameraGlobal*)m_pSceneControl->GetCameraWorld();
|
|
camera->Interia();
|
|
|
|
planeLayer->SetVisible(false);
|
|
layers = NULL;
|
|
}
|
|
|
|
//显示飞机模型(得到差分定位结果后调用,在地图上显示飞机模型)
|
|
void ShowPlane3D::displayPlane(QVector<double> lon, QVector<double> lat, QVector<double> height)
|
|
{
|
|
if(lon.size()==0 || lat.size()==0 || height.size()==0)
|
|
return;
|
|
movePlane(lon, lat, height);
|
|
//刷新
|
|
m_pSceneControl->Refresh(planeLayer);
|
|
|
|
// layers = NULL;
|
|
// planeLayer = NULL;
|
|
}
|
|
|
|
//设置飞机数量
|
|
void ShowPlane3D::setPlanesCount(int n)
|
|
{
|
|
this->n_planes = n;
|
|
if(n>=res->GetRecordCount())
|
|
{
|
|
addPlane();
|
|
}
|
|
else
|
|
{
|
|
deletePlane();
|
|
}
|
|
}
|
|
|
|
void ShowPlane3D::startFly()
|
|
{
|
|
//每500ms刷新一次
|
|
m_timer.setInterval(1000);
|
|
lons.append(119.718414);
|
|
lats.append(32.234539);
|
|
heights.append(25);
|
|
connect(&m_timer,&QTimer::timeout,this,[=](){
|
|
movePlane(lons,lats,heights);
|
|
// m_pSceneControl->Refresh(planeLayer);
|
|
// m_pSceneControl->GetScene3D()->UpdateData();
|
|
lons.replace(0,lons.at(0)+0.0001);
|
|
// m_pSceneControl->GetCameraWorld()->Refresh();
|
|
// lats.replace(0,lats.at(0)+0.0005);
|
|
});
|
|
m_timer.start();
|
|
planeLayer->SetVisible(true);
|
|
// m_pDynamicLayer->SetVisible(true);
|
|
}
|
|
|
|
void ShowPlane3D::stopFly()
|
|
{
|
|
m_timer.stop();
|
|
// m_pDynamicLayer->SetVisible(false);
|
|
m_pSceneControl->Refresh(planeLayer);
|
|
// m_pDynamicLayer->RemoveAll();
|
|
// m_planes.clear();
|
|
}
|
|
|
|
//修改模型显示位置
|
|
void ShowPlane3D::movePlane(QVector<double> lon, QVector<double> lat, QVector<double> height)
|
|
{
|
|
if(res==NULL) return;
|
|
if(lon.size()>res->GetRecordCount()) return;
|
|
|
|
UGGeometry* geometry = NULL;
|
|
UGGeoModelPro* model = NULL;
|
|
res->MoveFirst();
|
|
res->Edit();
|
|
for(int i=0;i<lon.size();i++)
|
|
{
|
|
res->GetGeometry(geometry); //geometryType: GeoModelPro
|
|
model = (UGGeoModelPro*)geometry;
|
|
model->SetPosition(UGPoint3D(lon.at(i),lat.at(i),height.at(i)));
|
|
res->SetGeometry(*model);
|
|
res->MoveNext();
|
|
model = NULL;
|
|
}
|
|
res->Update();
|
|
|
|
// m_pSceneControl->GetCameraWorld()->UpdateTrackingCamera(model);
|
|
|
|
geometry = NULL;
|
|
model = NULL;
|
|
|
|
}
|
|
|
|
void ShowPlane3D::deletePlane()
|
|
{
|
|
int n = abs( res->GetRecordCount() - n_planes);
|
|
// res->Edit();
|
|
// res->MoveLast();
|
|
res->MoveTo(n_planes-1);
|
|
res->EditBulk(true); //设置开始批量编辑标志
|
|
for(int i=0;i<n;i++)
|
|
{
|
|
res->Delete();
|
|
}
|
|
// res->Update();
|
|
|
|
res->FlushBulkEdit(); //强制刷新
|
|
res->EditBulk(false); //批量编辑结束
|
|
|
|
qDebug()<<"*****************RecordCount:"<<res->GetRecordCount();
|
|
}
|
|
|
|
void ShowPlane3D::addPlane()
|
|
{
|
|
// if(!dv->IsOpen()) dv->Open();
|
|
// UGQueryDef query;
|
|
// UGRecordsetPtr res = dv->Query(query);
|
|
// qDebug()<<"*****************RecordCount:"<<res->GetRecordCount();
|
|
int n = abs(n_planes - res->GetRecordCount());
|
|
// UGGeometry* geometry = NULL;
|
|
// res->GetGeometry(geometry); //geometryType: GeoModelPro
|
|
UGFeature* ft = ft = res->GetFeature();
|
|
// UGGeoModelPro* model = (UGGeoModelPro*)geometry;
|
|
// UGGeoModelPro model;
|
|
|
|
res->EditBulk(true); //设置开始批量编辑标志
|
|
for(int i=0;i<n;i++)
|
|
{
|
|
// model.MakeWithGeometry(geometry);
|
|
// model.SetPosition(UGPoint3D(0,0,0));
|
|
// res->AddNew(&model);
|
|
res->AddOneFeature(ft);
|
|
// res->MoveNext();
|
|
}
|
|
res->FlushBulkEdit(); //强制刷新
|
|
res->EditBulk(false); //批量编辑结束
|
|
// res->Update();
|
|
|
|
// geometry = NULL;
|
|
// model = NULL;
|
|
ft = NULL;
|
|
qDebug()<<"*****************RecordCount:"<<res->GetRecordCount();
|
|
}
|