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++

#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();
}