#include "showplane3d.h" #include "Geometry3D/UGGeoModelPro.h" #include "Render/UGCameraGlobal.h" #include 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 lon, QVector lat, QVector 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 lon, QVector lat, QVector 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;iGetGeometry(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;iDelete(); } // res->Update(); res->FlushBulkEdit(); //强制刷新 res->EditBulk(false); //批量编辑结束 qDebug()<<"*****************RecordCount:"<GetRecordCount(); } void ShowPlane3D::addPlane() { // if(!dv->IsOpen()) dv->Open(); // UGQueryDef query; // UGRecordsetPtr res = dv->Query(query); // qDebug()<<"*****************RecordCount:"<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;iAddNew(&model); res->AddOneFeature(ft); // res->MoveNext(); } res->FlushBulkEdit(); //强制刷新 res->EditBulk(false); //批量编辑结束 // res->Update(); // geometry = NULL; // model = NULL; ft = NULL; qDebug()<<"*****************RecordCount:"<GetRecordCount(); }