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.

905 lines
28 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* Author: Jun0x01@github.com
* Date: 2019.06.06
*/
#include "SceneControl.h"
#include "Log.h"
#include <QDebug>
#include <QtMath>
#include "translator.h"
#include "Base/OgdcPoint3D.h"
#include "Base3D/UGMathEngine.h"
#include "geofeatureoperator.h"
#include "Geometry3D/UGGeoModelPro.h"
//using namespace SuperMap;
SceneControl::SceneControl(void* pWndHandle, int dpiX, int dpiY)
{
m_pUGSceneWnd = NULL;
//m_pRoot3D = NULL;
m_pCameraWorld = NULL;
m_IsMinSized = false;
Initialize(pWndHandle, dpiX, dpiY);
// setCallBackFunc();
// m_pInnerWorkspace = new Workspace();
m_pWorkspace = NULL;
// SetWorkspace(m_pInnerWorkspace);
mIsInWorkspace = false;
}
SceneControl::~SceneControl()
{
if (m_pUGSceneWnd != NULL)
{
// close the scene
m_pUGSceneWnd->m_SceneWindow.Reset();
}
delete m_pUGSceneWnd;
m_pUGSceneWnd = NULL;
// delete m_pInnerWorkspace;
// m_pInnerWorkspace = NULL;
m_pWorkspace = NULL;
m_pWnd = NULL;
}
//设置回调函数
void SceneControl::setCallBackFunc()
{
/*
m_pUGSceneWnd->m_SceneWindow.SetAction3DChangedFunc(Action3DChangedCallBack,(UGlong)this);
m_pUGSceneWnd->m_SceneWindow.SetTracking3DFunc(Tracking3DCallBack,(UGlong)this);
m_pUGSceneWnd->m_SceneWindow.SetTracked3DFunc(Tracked3DCallBack,(UGlong)this);
m_pUGSceneWnd->m_SceneWindow.SetPointInput3DFunc(PointInput3DCallBack,(UGlong)this);
m_pUGSceneWnd->GetScene3D()->SetAfterGeometryAdded3DFunc(AfterGeometryAdded3DCallBack,(UGlong)this);
*/
}
UGRoot3D* SceneControl::m_pRoot3D = NULL;
bool SceneControl::mIsInitializeUGRoot3D = false;
void SceneControl::Initialize(void* pWndHandle, int dpiX, int dpiY)
{
// set graphics engine type
//#ifdef WIN32
// UGGraphicsManager::SetCurGraphicsType(UGC::UGGraphics::GT_Windows);
//#else
// UGGraphicsManager::SetCurGraphicsType(UGGraphics::GT_QT);
//#endif
// 1.
if (SceneControl::m_pRoot3D == NULL) {
SceneControl::m_pRoot3D = new UGC::UGRoot3D();
SceneControl::m_pRoot3D->Initialize(NULL);
SceneControl::m_pRoot3D->SetGraphics3DType(UGC::RST_OGRE);
SceneControl::mIsInitializeUGRoot3D = true;
}
Window3D wnd = (Window3D)pWndHandle;
UGScene3D* pScene = m_pRoot3D->CreateScene(wnd);
pScene->SetType(ST_EARTH_ELLIPSOID_WGS84);
pScene->SetDrawMode(UGC::REAL_TIME_RASTER);
// pScene->SetDrawMode(UGC::DRAW_SCREEN);
m_pCameraWorld = pScene->CreateCamera(_U("Camera"));
UGCameraState ChinaState;
ChinaState.dLon= UGMathEngine::DegreesToRadians(105);
ChinaState.dLat= UGMathEngine::DegreesToRadians(33);
ChinaState.dHeading = 0;
ChinaState.dTilt=0;
ChinaState.dAltitude=11269.38*1000;
m_pCameraWorld->SetCamera(ChinaState);
pScene->GetRenderTarget()->AddViewport(m_pCameraWorld, 0);
m_pRoot3D->SetActiveScene(pScene);
m_pUGSceneWnd = new UGSceneEditorWnd(pScene);
m_pUGSceneWnd->SetOpenEditMode(true);
m_pUGSceneWnd->SetEditEnvironment();
// dpi info
pScene->InitializeScene(_U(""), dpiX, dpiY);
pScene->GetLatLongGrid()->SetVisible(false);//设置经纬网不可见
m_pRoot3D->Render();
}
UGuint SceneControl::getKeyUGFlags(unsigned int flag)
{
UGint flags = 0;
if(flag & UG_VK_MENU || flag & UG_VK_SHIFT || flag & UG_VK_CONTROL)
{
flags = flag; // TODO: change
}
return flags;
}
void SceneControl::OnDraw(int rectLeft, int rectTop, int rectRight, int rectBottom, void* pHDC)
{
if (m_pUGSceneWnd != NULL)
{
m_pUGSceneWnd->GetScene3D()->Refresh();
}
}
void SceneControl::OnSizeChanged(int x, int y, void* pHDC)
{
UGRect rect(0, 0, x, y);
bool isEmpty = rect.IsEmpty();
if(!isEmpty && m_pUGSceneWnd != NULL)
{
m_pUGSceneWnd->OnSize(x, y);
m_pUGSceneWnd->GetScene3D()->Refresh();
}
else
{
m_IsMinSized = isEmpty;
}
}
void SceneControl::OnLMouseDown(unsigned int nFlags, int x, int y, void* pHDC)
{
// if(m_pUGSceneWnd->Get3DCursorShape()==38 || m_pUGSceneWnd->Get3DCursorShape()==39 || m_pUGSceneWnd->Get3DCursorShape()==40)
// {
// return;
// }
UGPoint pt(x, y);
UGC::UGuint flag = getKeyUGFlags(nFlags);
qDebug()<<"****************LMouseDownFlag:"<<m_pUGSceneWnd->Get3DCursorShape();
// startTracking = true;
// UGVector3d p;
// m_pUGSceneWnd->m_SceneWindow.PixelToGlobal(p,pt,UGPixelToGlobalMode::Terrain);
// qDebug()<<"*******p.x:"<<p.x;
// qDebug()<<"*******p.y:"<<p.y;
// qDebug()<<"*******p.z:"<<p.z;
// qDebug()<<"*******Height:"<<m_pUGSceneWnd->GetScene3D()->GetHeight(p.x,p.y);
m_pUGSceneWnd->OnLButtonDown(flag, pt);
// m_pUGSceneWnd->m_SceneWindow.OnLButtonDown(flag, pt);
// qDebug()<<"****************LMouseDown:"<<m_pUGSceneWnd->Get3DCursorShape();
// m_pUGSceneWnd->Set3DCursorShape(15);
}
void SceneControl::OnLMouseUp(unsigned int nFlags, int x, int y, void* pHDC)
{
UGPoint pt(x, y);
UGC::UGuint flag = getKeyUGFlags(nFlags);
m_pUGSceneWnd->OnLButtonUp(flag, pt);
// m_pUGSceneWnd->m_SceneWindow.OnLButtonUp(flag, pt);
}
void SceneControl::OnLMouseDbClick(unsigned int nFlags, int x, int y, void* pHDC)
{
if(m_pUGSceneWnd->Get3DCursorShape()==39 || m_pUGSceneWnd->Get3DCursorShape()==40)
{
m_pUGSceneWnd->OnKeyDown(UG_VK_DELETE,0,UG_VK_SHIFT);//通过shift+delete组合键来实现节点删除
return;
};
// UGPoint pt(x, y);
// UGC::UGuint flag = getKeyUGFlags(nFlags);
// m_pUGSceneWnd->OnLButtonDblClk(flag, pt);
qDebug()<<"**********************OnLMouseDbClick1";
}
void SceneControl::OnMouseMove(unsigned int nFlags, int x, int y, void* pHDC)
{
UGPoint pt(x, y);
UGC::UGuint flag = getKeyUGFlags(nFlags);
m_pUGSceneWnd->OnMouseMove(flag, pt);
if(this->m_EditStatus)
{
}
}
void SceneControl::OnMouseWheel(unsigned int nFlags, short zDelta, int x, int y)
{
// the ratio is 1 after zooming in and zooming out, map scale will not be changed.
double ratio = 1;
if (zDelta > 0)
{
ratio = 5/4.0;
}
else
{
ratio = 4/5.0;
}
UGPoint pt(x, y);
UGC::UGuint flag = getKeyUGFlags(nFlags);
m_pUGSceneWnd->OnMouseWheel(flag, zDelta, pt);
}
void SceneControl::OnRMouseDown(unsigned int nFlags, int x, int y, void* pHDC)
{
UGPoint pt(x, y);
UGC::UGuint flag = getKeyUGFlags(nFlags);
m_pUGSceneWnd->OnRButtonDown(flag, pt);
// m_pUGSceneWnd->m_SceneWindow.OnRButtonDown(flag, pt);
// qDebug()<<"******************EidtUserAction:"<<m_pUGSceneWnd->GetUserAction();
// qDebug()<<"******************RButtonDown:";
// qDebug()<<"******************SubAction:"<<m_pUGSceneWnd->GetSubAction();
}
void SceneControl::OnRMouseUp(unsigned int nFlags, int x, int y, void* pHDC)
{
UGPoint pt(x, y);
UGC::UGuint flag = getKeyUGFlags(nFlags);
m_pUGSceneWnd->OnRButtonUp(flag, pt);
// m_pUGSceneWnd->m_SceneWindow.OnRButtonUp(flag, pt);
}
void SceneControl::OnMidMouseDown(unsigned int nFlags, int x, int y, void* pHDC)
{
UGPoint pt(x, y);
UGC::UGuint flag = getKeyUGFlags(nFlags);
m_pUGSceneWnd->OnMButtonUp(flag, pt);
}
void SceneControl::OnMidMouseUp(unsigned int nFlags, int x, int y, void* pHDC)
{
UGPoint pt(x, y);
UGC::UGuint flag = getKeyUGFlags(nFlags);
m_pUGSceneWnd->OnMButtonDown(flag, pt);
}
UGPoint3D SceneControl::PixelToSceneGlobal(int x, int y)
{
UGPoint pt(x, y);
return PixelToSceneGlobal(pt);
}
UGPoint3D SceneControl::PixelToSceneGlobal(UGPoint pt)
{
UGPoint2D pntlp;
UGPoint3D pnt2D(0.0, 0.0, 0.0);
// TODO:
return pnt2D;
}
UGPoint SceneControl::SceneGlobalToPixel(double x, double y, double z)
{
UGPoint3D pnt(x, y, z);
return SceneGlobalToPixel(pnt);
}
UGPoint SceneControl::SceneGlobalToPixel(UGPoint3D pnt)
{
UGPoint2D pntlp;
UGPoint pt(0, 0);
// TODO:
return pt;
}
void SceneControl::Refresh()
{
////m_pUGSceneWnd->Refresh();
/*if (m_pUGSceneWnd != NULL) {
m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->Refresh();
}*/
UGLayer3Ds* pLayers = GetUGLayer3Ds();
for (int i = 0; i < pLayers->GetInnerCount(); i++)
{
UGLayer3D* pLayer = pLayers->GetLayerInnerAt(i);
pLayer->SetInitialized(false);
pLayers->RefreshRasterLayer(pLayer);
}
pLayers = NULL;
}
void SceneControl::Refresh(UGLayer3D *pLayer)
{
UGLayer3Ds* pLayers = GetUGLayer3Ds();
pLayer->SetInitialized(false);
pLayers->RefreshRasterLayer(pLayer);
pLayers = NULL;
}
void SceneControl::RenderInTimer() {
m_pRoot3D->Render();
}
UGSceneEditorWnd* SceneControl::GetSceneEditWnd()
{
return m_pUGSceneWnd;
}
UGLayer3Ds* SceneControl::GetUGLayer3Ds()
{
return &(m_pUGSceneWnd->GetScene3D()->m_Layers);
}
UGTrackingLayer3D *SceneControl::GetTrackingLayer3D()
{
return &(m_pUGSceneWnd->GetScene3D()->m_TrackingLayer3D);
}
UGScene3D *SceneControl::GetScene3D()
{
return m_pUGSceneWnd->GetScene3D();
}
UGCameraWorld *SceneControl::GetCameraWorld()
{
return m_pCameraWorld;
}
void SceneControl::SetEditableLayer(UGLayer3D* pLayer, bool isEditable)
{
// TODO:
GetUGLayer3Ds()->SetEditableLayer(pLayer,isEditable);
// this->m_EditStatus = isEditable;
}
void SceneControl::SetSelectionLayerEditable(bool isEditable)
{
UGLayer3D* editLayer3D = GetSelectionLayer();
if(!editLayer3D->GetEditable())
this->SetEditableLayer(editLayer3D,isEditable);
editLayer3D = NULL;
}
bool SceneControl::GetEditStatus()
{
return this->m_EditStatus;
}
void SceneControl::SetEditStatus(bool isEditable)
{
this->m_EditStatus = isEditable;
}
void SceneControl::SetWorkspace(Workspace* workspace)
{
if (workspace == m_pWorkspace)
{
return;
}
m_pWorkspace = workspace;
if (m_pWorkspace != NULL && m_pUGSceneWnd != NULL)
{
UGWorkspace* pUGWorkspace = m_pWorkspace->GetUGWorkspace();
m_pUGSceneWnd->GetScene3D()->m_Layers.SetWorkspace(pUGWorkspace);
m_pUGSceneWnd->GetScene3D()->m_Layers.SetDataSources(&(pUGWorkspace->m_DataSources));
m_pUGSceneWnd->GetScene3D()->m_Layers.SetWorkspaceName(pUGWorkspace->m_WorkspaceConnection.m_strWorkspaceName);
m_pUGSceneWnd->GetScene3D()->m_TerrainLayer3Ds.SetDataSources(&(pUGWorkspace->m_DataSources));
pUGWorkspace->m_SceneStorages.AttachWorkspace(m_pWorkspace->GetUGWorkspace());
}
}
void SceneControl::SetWorkspace(UGWorkspace *pWorkspace)
{
if(pWorkspace == NULL) return;
// qDebug()<<"******************:"<<(m_pWorkspace==NULL);
m_pWorkspace->setUGWorkspace(pWorkspace);
if (m_pWorkspace != NULL && m_pUGSceneWnd != NULL)
{
UGWorkspace* pUGWorkspace = m_pWorkspace->GetUGWorkspace();
m_pUGSceneWnd->GetScene3D()->m_Layers.SetWorkspace(pUGWorkspace);
m_pUGSceneWnd->GetScene3D()->m_Layers.SetDataSources(&(pUGWorkspace->m_DataSources));
m_pUGSceneWnd->GetScene3D()->m_Layers.SetWorkspaceName(pUGWorkspace->m_WorkspaceConnection.m_strWorkspaceName);
m_pUGSceneWnd->GetScene3D()->m_TerrainLayer3Ds.SetDataSources(&(pUGWorkspace->m_DataSources));
pUGWorkspace->m_SceneStorages.AttachWorkspace(m_pWorkspace->GetUGWorkspace());
}
}
UGWorkspace *SceneControl::getUGWorkspace()
{
return m_pWorkspace->GetUGWorkspace();
}
bool SceneControl::OpenScene(string sceneName)
{
UGString ugSceneName;
ugSceneName.FromStd(sceneName);
UGString sceneXML = m_pWorkspace->GetUGWorkspace()->m_SceneStorages.Find(ugSceneName)->GetXML();
// The last parameter(strWorkspaceName) is neccessary, and it is the path of workspace.
UGbool isOpen = m_pUGSceneWnd->GetScene3D()->FromXML(sceneXML, false, 0, m_pWorkspace->GetUGWorkspace()->m_WorkspaceConnection.m_strServer);
m_pUGSceneWnd->Refresh();
mIsInWorkspace = isOpen;
return isOpen;
}
UGLayer3D* SceneControl::AddLayerFromDataset(string datasourceName, string datasetName)
{
UGString ugDatasetName, ugDatasourceName;
ugDatasourceName.FromStd(datasourceName);
ugDatasetName.FromStd(datasetName);
UGDataSource* pDatasource = m_pWorkspace->GetUGWorkspace()->GetDataSource(ugDatasourceName);
UGLayer3D* pLayer = NULL;
if (pDatasource != NULL)
{
UGDatasetPtr pDataset = pDatasource->GetDataset(ugDatasetName);
if (pDataset != NULL)
{
UGDataset::DatasetType datasetType = pDataset->GetType();
UGString ugLayerName = ugDatasetName + _U("@") + ugDatasourceName; // 数据集名@数据源名,图层默认命名格式,也是通过该格式的名称获得关联数据
// AddLayer()支持多种数据格式:
// 1. 数据集datsetName@dataSourceName(当前工作空间中已经打开的数据)
// 2. 本地配置文件的路径( .sci, .scp, .kml等等具体可参考后面的 AddLayerFromFile() 函数)
pLayer = m_pUGSceneWnd->GetScene3D()->m_Layers.AddLayer(ugLayerName); // 若同名图层已经存在,会自动修改图层名, 通常追加"#1"
// 或使用下面的方法,可自定义图层名称和图层别名
//pLayer = m_pUGSceneWnd->GetScene3D()->m_Layers.AddLayer(ugLayerName, ugLayerName, ugLayerName);
if (pLayer != NULL)
{
// 添加模型数据集图层后,设置一下该图层的三维风格,否则不能显示贴图
// 若有其他数据类型出现同类问题,可考虑添加到此处,设置三维风格
if (datasetType == UGDataset::/*DatasetType::*/Model || datasetType == UGDataset::/*DatasetType::*/CAD)
{
// 此处仅设置一个三维风格,以达到启用目的
// 其他风格可根据需要设置
UGStyle3D style3D;
style3D.SetFill3DMode(UGC::/*UGFill3DMode::*/FILL_FACE);
pLayer->SetStyle3D(style3D);
}
}
}
else
{
Log::Error("Failed to add a dataset on scene. Not found dataset " + datasetName + " in the datasource named " + datasourceName);
}
}
else
{
Log::Error("Failed to add a dataset on scene. Not found datasource " + datasourceName);
}
return pLayer;
}
UGLayer3D* SceneControl::AddLayerFromDataset( UGString ugDatasourceName,UGString ugDatasetName)
{
UGDataSource* pDatasource = m_pWorkspace->GetUGWorkspace()->GetDataSource(ugDatasourceName);
UGLayer3D* pLayer = NULL;
if (pDatasource != NULL)
{
UGDatasetPtr pDataset = pDatasource->GetDataset(ugDatasetName);
if (pDataset != NULL)
{
UGDataset::DatasetType datasetType = pDataset->GetType();
UGString ugLayerName = ugDatasetName + _U("@") + ugDatasourceName; // 数据集名@数据源名,图层默认命名格式,也是通过该格式的名称获得关联数据
// AddLayer()支持多种数据格式:
// 1. 数据集datsetName@dataSourceName(当前工作空间中已经打开的数据)
// 2. 本地配置文件的路径( .sci, .scp, .kml等等具体可参考后面的 AddLayerFromFile() 函数)
pLayer = m_pUGSceneWnd->GetScene3D()->m_Layers.AddLayer(ugLayerName); // 若同名图层已经存在,会自动修改图层名, 通常追加"#1"
// 或使用下面的方法,可自定义图层名称和图层别名
//pLayer = m_pUGSceneWnd->GetScene3D()->m_Layers.AddLayer(ugLayerName, ugLayerName, ugLayerName);
if (pLayer != NULL)
{
// 添加模型数据集图层后,设置一下该图层的三维风格,否则不能显示贴图
// 若有其他数据类型出现同类问题,可考虑添加到此处,设置三维风格
if (datasetType == UGDataset::/*DatasetType::*/Model || datasetType == UGDataset::/*DatasetType::*/CAD)
{
// 此处仅设置一个三维风格,以达到启用目的
// 其他风格可根据需要设置
UGStyle3D style3D;
style3D.SetFill3DMode(UGC::/*UGFill3DMode::*/FILL_FACE);
pLayer->SetStyle3D(style3D);
}
}
}
else
{
Log::Error("Failed to add a dataset on scene. Not found dataset " + UGStrConvertor::Tostring(ugDatasetName) + " in the datasource named " + UGStrConvertor::Tostring(ugDatasourceName));
}
}
else
{
Log::Error("Failed to add a dataset on scene. Not found datasource " + UGStrConvertor::Tostring(ugDatasourceName));
}
return pLayer;
}
bool SceneControl::Save()
{
UGString sceneName = m_pUGSceneWnd->GetScene3D()->GetName();
bool isSaved = false;
if (mIsInWorkspace) {
UGSceneStorage* pSceneStorage = m_pWorkspace->GetUGWorkspace()->m_SceneStorages.Find(sceneName);
if(pSceneStorage != NULL)
{
pSceneStorage->SetXML(m_pUGSceneWnd->GetScene3D()->ToXML(), pSceneStorage->GetVersion());
isSaved = true;
}
else
{
string strSceneName;
sceneName.ToStd(strSceneName);
isSaved = SaveAs(strSceneName);
mIsInWorkspace = isSaved;
}
}
else
{
string strSceneName;
sceneName.ToStd(strSceneName);
isSaved = SaveAs(strSceneName);
mIsInWorkspace = isSaved;
}
return isSaved;
}
bool SceneControl::SaveAs(string sceneName)
{
UGString ugSceneName;
ugSceneName.FromStd(sceneName);
UGSceneStorages* pSStore = &(m_pWorkspace->GetUGWorkspace()->m_SceneStorages);
UGString validSceneName = pSStore->GetUnoccupiedSceneName(ugSceneName);
bool isAdd = pSStore->Add(validSceneName);
int count = pSStore->GetCount();
bool isSaved = false;
if (isAdd)
{
UGSceneStorage* pSceneStorage = pSStore->GetSceneAt(count - 1);
pSceneStorage->SetXML(m_pUGSceneWnd->GetScene3D()->ToXML(), pSceneStorage->GetVersion());
isSaved = true;
mIsInWorkspace = true;
}
return isSaved;
}
void SceneControl::ActivateScene() {
if (m_pRoot3D != NULL && m_pUGSceneWnd != NULL)
{
m_pRoot3D->SetActiveScene(m_pUGSceneWnd->GetScene3D());
}
}
UGLayer3D* SceneControl::AddLayerFromFile(string filePath)
{
UGString ugFilePath;
ugFilePath.FromStd(filePath);
bool exist = UGFile::IsExist(ugFilePath);
UGLayer3D* pLayer = NULL;
if (exist)
{
// 本地配置文件的路径(.sci, .scm, .scp, .sct, .kml, .sit, .SCVO等等)
pLayer = m_pUGSceneWnd->GetScene3D()->m_Layers.AddLayer(ugFilePath);
if (pLayer == NULL)
{
Log::Error("Unsupported file: " + filePath);
}
}
else
{
Log::Error("Not found the file: " + filePath);
}
return pLayer;
}
UGTerrainAccessor* SceneControl::AddTerrainLayerFromFile(string filePath)
{
UGString ugFilePath;
ugFilePath.FromStd(filePath);
UGString suffix = UGFile::GetExt(ugFilePath);
UGString fileName = UGFile::GetName(ugFilePath);
UGTerrainAccessor* pTerrain = NULL;
UGString layerName = fileName.Left(fileName.GetLength() - suffix.GetLength());
// Terraint Layer
if (suffix.CompareNoCase(_U(".sct")) == 0)
{
pTerrain = m_pUGSceneWnd->GetScene3D()->m_TerrainLayer3Ds.AddTerrainLayer(ugFilePath, layerName);
}
else
{
Log::Error("Unsupported file ! " + filePath);
}
return pTerrain;
}
//获取第一个高亮对象所在图层
UGLayer3D *SceneControl::GetSelectionLayer()
{
UGLayer3Ds* pLayers = GetUGLayer3Ds();
int count = pLayers->GetInnerCount();
UGLayer3D* pLayer = NULL;
for (int i = 0; i < count; i++)
{
pLayer = pLayers->GetLayerInnerAt(i);
UGSelection3D* pSelection = pLayer->GetSelection3D();
if (NULL != pSelection && pSelection->GetSize() > 0)
{
return pLayer;
}
}
return pLayer;
}
UGArray<UGSelection3D*>* SceneControl::GetGeoSelections()
{
UGLayer3Ds* pLayers = GetUGLayer3Ds();
int count = pLayers->GetInnerCount();
UGArray<UGSelection3D*>* pSelectionArr = NULL;
for (int i = 0; i < count; i++)
{
UGLayer3D* pLayer = pLayers->GetLayerInnerAt(i);
UGSelection3D* pSelection = pLayer->GetSelection3D();
if (NULL != pSelection && pSelection->GetSize() > 0)
{
if (NULL == pSelectionArr)
{
pSelectionArr = new UGArray<UGSelection3D*>();
}
pSelectionArr->Add(pSelection);
}
pLayer = NULL;
pSelection = NULL;
}
pLayers = NULL;
return pSelectionArr;
}
UGRecordsetPtr SceneControl::ToRecordset(UGSelection3D* pSelection, bool isEditable /*= false*/)
{
UGRecordsetPtr pRecordset = NULL;
if (NULL != pSelection && pSelection->GetSize() > 0)
{
UGLayer3D* pLayer = pSelection->GetLayer3D();
// UGDatasetVector* pDataset = NULL;
UGDatasetPtr pDataset = NULL;
UGLayer::UGLayerType type = (UGLayer::UGLayerType)pLayer->GetType();
switch (type)
{
case UGC::/*UGLayer3DType::*/l3dDatasetVector:
{
UGLayer3DDatasetVector* pLayer3DDatasetVector = (UGLayer3DDatasetVector*)(pLayer);
pDataset = pLayer3DDatasetVector->GetDataset();
break;
}
case UGC::/*UGLayer3DType::*/l3dDatasetModelPro:
{
UGLayer3DDatasetModelPro* pLayer3DDatasetModel = (UGLayer3DDatasetModelPro*)(pLayer);
pDataset = pLayer3DDatasetModel->GetDataset();
break;
}
case UGC::/*UGLayer3DType::*/l3dDatasetVectorPoint:
{
UGLayer3DDatasetVectorPoint* pLayer3DDatasetPoint = (UGLayer3DDatasetVectorPoint*)(pLayer);
pDataset = pLayer3DDatasetPoint->GetDataset();
break;
}
case UGC::/*UGLayer3DType::*/l3dDatasetVectorLR:
{
UGLayer3DDatasetVectorLR* pLayer3DDatasetRegion = (UGLayer3DDatasetVectorLR*)(pLayer);
pDataset = pLayer3DDatasetRegion->GetDataset();
break;
}
}
if (NULL != pDataset)
{
pDataset->Open();
UGQueryDef queryDef;
// 获取所有选中对象的SmID, 作为查询条件
UGint count = pSelection->GetSize();
UGString filter = _U("(SmID in(");
for (int i = 0; i < count ; i++)
{//queryDef.m_IDs.Add((UGint)1); // 使用后m_IDs释放有问题, 因此使用下面的方式构造查询条件
UGString temp;
if (i < count - 1)
{
temp.Format(_U("%d,"), pSelection->GetAt(i));
}
else
{
temp.Format(_U("%d))"), pSelection->GetAt(i));
}
filter += temp;
}
// 设置查询类型
queryDef.m_strFilter = filter;
queryDef.m_nType = UGQueryDef::/*QueryType::*/General; // IDs为使用SmID查询queryDef.m_IDs
if (pDataset->GetType() == UGDataset::Tabular)
{
queryDef.m_nOptions = UGQueryDef::Attribute;
}
else
{
queryDef.m_nOptions = UGQueryDef::Both;
}
queryDef.m_nMode = UGQueryDef::GeneralQuery;
queryDef.m_nCursorType = UGQueryDef::OpenDynamic; // OpenStatic, 用于读取数据OpenDynamic, 用于数据增删改
UGDatasetVector* dv = (UGDatasetVector*)pDataset.get();
UGFieldInfos fieldInfos;
dv->GetFieldInfos(fieldInfos); // 获取字段信息可用来添加或删除非系统字段只是用于查找字段值也可通过UGRecordset获取
int countOld = dv->GetRecordsetCount();
pRecordset = dv->Query(queryDef);
}
}
return pRecordset;
}
void SceneControl::ViewToLayer(UGLayer3D* pLayer)
{
// UGRect2D bounds = pLayer->GetBounds();
// UGCameraState state;
// state.dLon = UGMathEngine::DegreesToRadians(bounds.CenterPoint().x);
// state.dLat = UGMathEngine::DegreesToRadians(bounds.CenterPoint().y);
// state.dAltitude = 0;
// state.dDistance = 5.4*1000;
// state.dHeading = 0;
// state.dTilt = UGMathEngine::DegreesToRadians(60); //UGMathEngine::DegreesToRadians(60)
// UGCameraState lookatstate = state;
// lookatstate.dTilt = 0;
if (pLayer != NULL)
{
m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->FlyToBounds(pLayer->GetBounds(), 6000);
// m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->FlyToCamera(state,7000);
// m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->FlyTo(lookatstate,7000);
// m_pCameraWorld->m_StateLookAt.dLon = state.dLon;
// m_pCameraWorld->m_StateLookAt.dLat = state.dLat;
// m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->SetLookAt(lookatstate);
}
}
//定位到模型图层
void SceneControl::ViewToModelLayer(UGLayer3D *pModelLayer,long nMillSec)
{
//获取模型位置
UGDatasetVector* dv = (UGDatasetVector*)pModelLayer->GetAttachData();
dv->Open();
UGQueryDef queryDef;
UGRecordsetPtr res = dv->Query(queryDef);
UGGeometry* geometry = NULL;
res->GetGeometry(geometry);
UGGeoModelPro* model = (UGGeoModelPro*)geometry;
UGPoint3D pt3D = model->GetPosition();
//设置相机LookAt
UGCameraState lookatstate;
lookatstate.dLon = UGMathEngine::DegreesToRadians(pt3D.x);
lookatstate.dLat = UGMathEngine::DegreesToRadians(pt3D.y);
lookatstate.dAltitude = pt3D.z;
lookatstate.dDistance = pt3D.z;
lookatstate.dHeading = 0;
lookatstate.dTilt = UGMathEngine::DegreesToRadians(85);
//飞行到模型位置
m_pCameraWorld->FlyTo(lookatstate,nMillSec);
geometry = NULL;
model = NULL;
}
void SceneControl::Close()
{
m_pUGSceneWnd->GetScene3D()->Reset();
m_pUGSceneWnd->GetScene3D()->SetDrawMode(REAL_TIME_RASTER);
m_pUGSceneWnd->GetScene3D()->Refresh();
}
void SceneControl::removeLayer3D(UGString layerName)
{
UGLayer3Ds* pLayer3Ds = GetUGLayer3Ds();
int layerIndex = pLayer3Ds->FindNameInner(layerName);
if(layerIndex>=0)
{//图层存在则删除
pLayer3Ds->TreeRemoveAt(layerIndex);
}
pLayer3Ds = NULL;
}
void SceneControl::MeasureDistance()
{
m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaMeasureDistance);
}
void SceneControl::MeasureTerrainDistance()
{
m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaMeasureTerrainDistance);
}
void SceneControl::MeasureHorizontalDistance()
{
m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaMeasureHorizontalDistance);
}
void SceneControl::CalcuHeight()
{
m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaMeasureHeight);
}
void SceneControl::MeasureArea()
{
m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaMeasureArea);
}
void SceneControl::MeasureTerrainArea()
{
m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaMeasureTerrainArea);
}
void SceneControl::CalcuAngle()
{
// m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::);
}
void SceneControl::Pan()
{
m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaPan);
}
void SceneControl::ZoomIn()
{
// m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaPan);
}
void SceneControl::ZoomOut()
{
}
void SceneControl::ZoomFree()
{
}
void SceneControl::Select()
{
// m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaPointSelect);
// m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaRectSelect);
m_pUGSceneWnd->SetUserAction(UGSceneUserAction::suaPointSelect);
// qDebug()<<"*********************:"<<m_pUGSceneWnd->GetUserAction();
}
void SceneControl::ViewEntire()
{
}