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.

336 lines
11 KiB
C++

#include "SceneLayersView.h"
SceneLayersView::SceneLayersView(QWidget *parent) : QTreeWidget(parent)
{
addDefaultTree();
this->setHeaderLabel(tr("Empty Map"));
this->expandAll(); // 展开全部
ItemDataType = Qt::UserRole + 1;
// 允许右键菜单
setContextMenuPolicy(Qt::CustomContextMenu);
}
void SceneLayersView::addDefaultTree()
{
// 初始化
pTreeNormalLayers = new QTreeWidgetItem(this);
pTreeTerrianLayers = new QTreeWidgetItem(this);
// 设置标题
pTreeTerrianLayers->setText(0, tr("Terrian Layers"));
pTreeNormalLayers->setText(0, tr("Normal Layers"));
// 设置图标
pTreeTerrianLayers->setIcon(0, Icons::getInstance().iconLayerGroup);
pTreeNormalLayers->setIcon(0, Icons::getInstance().iconMaps);
// 设置类型
pTreeTerrianLayers->setData(0, ItemDataType, QVariant::fromValue((int)TypeTerrainLayers));
pTreeNormalLayers->setData(0, ItemDataType, QVariant::fromValue((int)TypeDatasetLayers));
}
void SceneLayersView::clear()
{
clearItems(pTreeTerrianLayers);
clearItems(pTreeNormalLayers);
}
void SceneLayersView::clearItems(QTreeWidgetItem* pItem)
{
if (NULL != pItem)
{
int count = pItem->childCount();
for (int i = 0; i < count; i++)
{
QTreeWidgetItem* item = pItem->child(0);
pItem->removeChild(item);
delete item;
}
}
}
void SceneLayersView::updateLayers(SceneControl* sceneControl)
{
clearItems(pTreeTerrianLayers);
clearItems(pTreeNormalLayers);
if (NULL == sceneControl)
{
return;
}
UGString ugMapName = sceneControl->GetSceneEditWnd()->GetScene3D()->GetName();
std::string mapName = UGStrConvertor::Tostring(ugMapName);
this->setHeaderLabel(QString().fromStdString(mapName));
UGLayer3Ds* pLayers = sceneControl->GetUGLayer3Ds();
UGLayer3DCollection* pLayersCollection = pLayers->GetLayer3DsTree();
if (pLayersCollection != NULL) { // 当场景中没有普通图层, pLayersCollection 为 NULL
UGLayer3DPos pos = pLayersCollection->GetHeadPosition();
while (!pLayersCollection->IsEOF(pos))
{
UGLayer3D* pLayer3D = pLayersCollection->GetNext(pos);
updateLayer(pLayer3D, pTreeNormalLayers);
}
}
//int count = pLayers->GetInnerCount();
//for (int i = 0; i < count; i++)
//{
// UGLayer* pLayer = pLayers->GetLayerAt(i);
// updateLayer(pLayer, pTreeNormalLayers);
//}
UGTerrainLayer3Ds& pTerrains = sceneControl->GetSceneEditWnd()->GetScene3D()->m_TerrainLayer3Ds;
UGTerrainManager* pTerrainManager = pTerrains.GetTerrainManager();
int count = pTerrainManager->m_TerrainAccessors.GetCount();
UGList<UGTerrainAccessor*>::POSITION pos1;
UGTerrainAccessor* pTerrain = NULL;
for (int i = 0; i < count; i++)
{
pos1 = pTerrainManager->m_TerrainAccessors.FindIndex(i);
pTerrain = pTerrainManager->m_TerrainAccessors.GetAt(pos1);
UGString ugTerrainName = pTerrain->GetName();
std::string terrainName = UGStrConvertor::Tostring(ugTerrainName);
QTreeWidgetItem* pItem = new QTreeWidgetItem();
pItem->setText(typeIconCol, QString().fromStdString(terrainName));
pItem->setIcon(typeIconCol, Icons::getInstance().iconLayer3DTerrian);
pItem->setData(0, ItemDataType, QVariant::fromValue((int)TypeLayerTin)); // 设置数据集类型
}
}
void SceneLayersView::updateLayer(UGLayer3D* pLayer, QTreeWidgetItem* parent, bool isTop /*= false*/)
{
if (typeid(*pLayer) == typeid(UGLayer3DGroup))
{
UGString ugLayerName = pLayer->GetName();
std::string layerName = UGStrConvertor::Tostring(ugLayerName);
QTreeWidgetItem* pItem = new QTreeWidgetItem();
if (isTop) {
parent->insertChild(0, pItem);
}
else
{
parent->addChild(pItem);
}
pItem->setText(0, QString().fromStdString(layerName));
pItem->setIcon(0, Icons::getInstance().iconDs);
int count = ((UGLayer3DGroup*)pLayer)->GetCount();
for (int i = 0; i < count; i++)
{
UGLayer3D* pLayer1 = ((UGLayer3DGroup*)pLayer)->GetAt(i);
updateLayer(pLayer1, pItem);
}
}
else // Layer
{
UGString ugLayerName = pLayer->GetCaption(); // GetName();
UGLayer::UGLayerType type = (UGLayer::UGLayerType)pLayer->GetType();
std::string layerName = UGStrConvertor::Tostring(ugLayerName);
QTreeWidgetItem* pItem = new QTreeWidgetItem();
if (isTop) {
parent->insertChild(0, pItem);
}
else
{
parent->addChild(pItem);
}
pItem->setText(typeIconCol, QString().fromStdString(layerName));
pItem->setIcon(typeIconCol, Icons::getInstance().iconDataTypeUnknown);
ItemType layerItemType = TypeLayer;
UGDataset* pDataset = NULL;
switch (type)
{
case UGC::/*UGLayer3DType::*/l3dNone:
break;
case UGC::/*UGLayer3DType::*/l3dFile:
break;
case UGC::/*UGLayer3DType::*/l3dTree:
break;
case UGC::/*UGLayer3DType::*/l3dDataset:
break;
case UGC::/*UGLayer3DType::*/l3dGeImage:
break;
case UGC::/*UGLayer3DType::*/l3dTracking:
break;
case UGC::/*UGLayer3DType::*/l3dScreen:
break;
case UGC::/*UGLayer3DType::*/l3dModel:
break;
case UGC::/*UGLayer3DType::*/l3dTerrain:
break;
case UGC::/*UGLayer3DType::*/l3dMap:
break;
case UGC::/*UGLayer3DType::*/l3dVector:
break;
case UGC::/*UGLayer3DType::*/l3dDynamicModel:
break;
case UGC::/*UGLayer3DType::*/l3dVolumeFile:
break;
case UGC::/*UGLayer3DType::*/l3dCoDesigner:
break;
case UGC::/*UGLayer3DType::*/l3dDatasetImage:
{
UGLayer3DDatasetImage* pLayer3DDatasetImage = (UGLayer3DDatasetImage*)(pLayer);
pDataset = pLayer3DDatasetImage->GetDataset().get();
}
break;
case UGC::/*UGLayer3DType::*/l3dDatasetVector:
{
UGLayer3DDatasetVector* pLayer3DDatasetVector = (UGLayer3DDatasetVector*)(pLayer);
pDataset = pLayer3DDatasetVector->GetDataset().get();
}
break;
case UGC::/*UGLayer3DType::*/l3dOSGB:
layerItemType = TypeLayerOSGB;
pItem->setIcon(typeIconCol, Icons::getInstance().iconLayer3DOSGBCache);
break;
case UGC::/*UGLayer3DType::*/l3dDatasetModelPro:
{
UGLayer3DDatasetModelPro* pLayer3DDatasetModel = (UGLayer3DDatasetModelPro*)(pLayer);
pDataset = pLayer3DDatasetModel->GetDataset().get();
}
break;
case UGC::/*UGLayer3DType::*/l3dDatasetVolume:
{
UGLayer3DDatasetVolume* pLayer3DDatasetVolume = (UGLayer3DDatasetVolume*)(pLayer);
pDataset = pLayer3DDatasetVolume->GetDataset().get();
}
break;
case UGC::/*UGLayer3DType::*/l3dPlotting:
layerItemType = TypeLayerCAD;
pItem->setIcon(typeIconCol, Icons::getInstance().iconDatasetCAD);
break;
case UGC::/*UGLayer3DType::*/l3dTinTerrain:
layerItemType = TypeLayerTerrain;
pItem->setIcon(typeIconCol, Icons::getInstance().iconLayer3DTerrian);
break;
case UGC::/*UGLayer3DType::*/l3dWMS:
case UGC::/*UGLayer3DType::*/l3dWMTS:
case UGC::/*UGLayer3DType::*/l3dBingMaps:
case UGC::/*UGLayer3DType::*/l3dGoogleMaps:
case UGC::/*UGLayer3DType::*/l3dOpenStreetMaps:
layerItemType = TypeLayerImage;
pItem->setIcon(typeIconCol, Icons::getInstance().iconDatasetImage);
break;
case UGC::/*UGLayer3DType::*/l3dGroup:
break;
case UGC::/*UGLayer3DType::*/l3dDatasetVectorPoint:
{
UGLayer3DDatasetVectorPoint* pLayer3DDatasetPoint = (UGLayer3DDatasetVectorPoint*)(pLayer);
pDataset = pLayer3DDatasetPoint->GetDataset().get();
}
break;
case UGC::/*UGLayer3DType::*/l3dDatasetVectorLR:
{
UGLayer3DDatasetVectorLR* pLayer3DDatasetRegion = (UGLayer3DDatasetVectorLR*)(pLayer);
pDataset = pLayer3DDatasetRegion->GetDataset().get();
}
break;
default:
pItem->setIcon(typeIconCol, Icons::getInstance().iconLayer3DOSGBCache);
break;
}
if (NULL != pDataset)
{
layerItemType = updateItemByDataset(pDataset, pItem);
}
pItem->setData(0, ItemDataType, QVariant::fromValue((int)layerItemType)); // 设置数据集类型
}
}
void SceneLayersView::addLayer(UGLayer3D* pLayer, bool isTop /*= true*/)
{
if (NULL == pLayer)
{
return;
}
else
{
updateLayer(pLayer, pTreeNormalLayers, true);
}
}
SceneLayersView::ItemType SceneLayersView::updateItemByDataset(UGDataset* pDataset, QTreeWidgetItem* pItem)
{
UGDataset::DatasetType datasetType = pDataset->GetType();
ItemType layerItemType = TypeLayer;
switch (datasetType)
{
case UGDataset::/*DatasetType::*/Point:
layerItemType = TypeLayerPoint;
pItem->setIcon(typeIconCol, Icons::getInstance().iconDatasetPoint);
break;
case UGDataset::Line:
layerItemType = TypeLayerLine;
pItem->setIcon(typeIconCol, Icons::getInstance().iconDatasetLine);
break;
case UGDataset::Region:
layerItemType = TypeLayerRegion;
pItem->setIcon(typeIconCol, Icons::getInstance().iconDatasetRegion);
break;
case UGDataset::CAD:
layerItemType = TypeLayerCAD;
pItem->setIcon(typeIconCol, Icons::getInstance().iconDatasetCAD);
break;
case UGDataset::Text:
layerItemType = TypeLayerText;
pItem->setIcon(typeIconCol, Icons::getInstance().iconDatasetText);
break;
case UGDataset::Grid:
layerItemType = TypeLayerGrid;
pItem->setIcon(typeIconCol, Icons::getInstance().iconDatasetGrid);
break;
case UGDataset::DEM:
layerItemType = TypeLayerDEM;
pItem->setIcon(typeIconCol, Icons::getInstance().iconDatasetDEM);
break;
case UGDataset::PointZ:
layerItemType = TypeLayerPoint3D;
pItem->setIcon(typeIconCol, Icons::getInstance().iconDatasetPoint3D);
break;
case UGDataset::LineZ:
layerItemType = TypeLayerLine3D;
pItem->setIcon(typeIconCol, Icons::getInstance().iconDatasetLine3D);
break;
case UGDataset::RegionZ:
layerItemType = TypeLayerRegion3D;
pItem->setIcon(typeIconCol, Icons::getInstance().iconDatasetRegion3D);
break;
case UGDataset::Network:
case UGDataset::Network3D:
layerItemType = TypeLayerNetwork;
pItem->setIcon(typeIconCol, Icons::getInstance().iconDatasetRegion3D);
break;
case UGDataset::Model:
layerItemType = TypeLayerModel;
pItem->setIcon(typeIconCol, Icons::getInstance().iconDatasetModel);
break;
default:
pItem->setIcon(typeIconCol, Icons::getInstance().iconDataTypeUnknown);
break;
}
return layerItemType;
}