#include "displayroutedialog.h" #include "Geometry/UGGeoLine.h" #include "mapdatamaneger.h" #include "qdebug.h" #include "ui_displayroutedialog.h" #include "geofeatureoperator.h" #include "translator.h" #include "messagetips.h" #include "Map/UGLayer.h" #include "Map/UGMap.h" #include "Geometry/UGGeoPoint.h" #include "routeglobalvariant.h" #include "layeroperator.h" #include "Scene/UGLayer3D.h" #include "Scene/UGTrackingLayer3D.h" DisplayRouteDialog::DisplayRouteDialog(QWidget *parent) : QDialog(parent), ui(new Ui::DisplayRouteDialog) { ui->setupUi(this); this->resize(600,400); this->setWindowTitle("显示航线"); this->setWindowFlags(Qt::WindowCloseButtonHint); //关闭右上角帮助(?)按钮。 RouteType = routeGVar.getRouteType(); this->is3DMap = false; } DisplayRouteDialog::~DisplayRouteDialog() { delete ui; } void DisplayRouteDialog::setDataset(UGDatasetPtr dt) { this->dt = dt; this->dtv = (UGDatasetVector*)dt.get(); } void DisplayRouteDialog::setMapEditorWnd(UGMapEditorWnd *pMapEditorWnd) { this->pMapEditorWnd = pMapEditorWnd; this->is3DMap = false; } void DisplayRouteDialog::setSceneControl(SceneControl *pSceneControl) { this->pSceneControl = pSceneControl; this->is3DMap = true; } void DisplayRouteDialog::addRouteTypeItem() { GeoFeatureOperator gftOpt; UGRecordsetPtr res = gftOpt.queryFeature(dtv); if(!res) return; res->MoveFirst(); UGVariant v; QSet typeset; while(!res->IsEOF()) {//获取航线类型唯一值 res->GetFieldValue(_U("RouteType"),v); typeset.insert(v.ToInt()); res->MoveNext(); } for(auto i = typeset.begin(); i != typeset.end(); i ++) { ui->RouteTypeCbbox->addItem(RouteType[*i]); } } void DisplayRouteDialog::addRouteNumberItem(UGRecordsetPtr res) { ui->RouteNumberCbbox->clear(); QStringList strl; UGVariant v; res->MoveFirst(); if(res) { while (!res->IsEOF()) { //获取航线编号 res->GetFieldValue(_U("RouteNumber"),v); strl << Translator::UGStr2QStr(v.ToString()); res->MoveNext(); } } ui->RouteNumberCbbox->addItems(strl); } //显示二维航线 void DisplayRouteDialog::showRoute() { routeType = QString::number(RouteType.key(ui->RouteTypeCbbox->currentText())); QString typeFilter = "RouteType=" + routeType; QStringList routeNumberList = ui->RouteNumberCbbox->currentText().replaceInStrings(";",","); QString numFilter = "RouteNumber in (" + routeNumberList.join("\\,") + ")"; // qDebug()<<"******************************:"<MoveFirst(); /*********************UGLayer方法*********************/ UGMap* pMap = &pMapEditorWnd->m_mapWnd.m_Map; UGString layerName = Translator::QStr2UGStr(("RouteLayer" + routeType)); if(!pMap->m_Layers.IsLayerExisted(layerName)) { pMap->m_Layers.AddDataset(dt,true,UGLayer::UG_Layer_Normal,layerName); } UGLayer* layer = pMap->m_Layers.GetLayer(layerName); UGQueryDef queryDef; res->GetQueryDef(queryDef); layer->SetQueryDef(queryDef); //图层样式 UGStyle lineStyle; lineStyle.SetLineStyle(6); lineStyle.SetLineColor(routeGVar.getRouteTypeColor(routeType.toInt())); lineStyle.SetLineWidth(1); layer->SetStyle(lineStyle); // 航点标记动态图层 UGString dylayerName = Translator::QStr2UGStr(("LabelDyLayer" + routeType)); UGDynamicLayer *pDyLayer = NULL; getDyLayer(pMap,pDyLayer,dylayerName); //添加航点标记 UGGeometry* pTempGeomtry = NULL; QStringList num = routeNumberList.join("\\,").split(","); int i = 0; LayerOperator layerOpt; while(!res->IsEOF()) { UGGeoLine* line = new UGGeoLine(); // line->SetStyle(&lineStyle); res->GetGeometry(pTempGeomtry); pTempGeomtry->ConvertToLine(*line); QString lineAlias = routeType + "_" + num.at(i); pDyLayer->Add(Translator::QStr2UGStr(lineAlias),line); layerOpt.addNodeLabel(line,pDyLayer,routeType,num.at(i)); i++; res->MoveNext(); } pMapEditorWnd->Refresh(); /******************************************/ /**********************DyLayer********************/ /* UGGeometry* pTempGeomtry = NULL; UGMap* pMap = &pMapEditorWnd->m_mapWnd.m_Map; UGDynamicLayer* dyRouteLayer = new UGDynamicLayer(); dyRouteLayer->SetLayerName(_U("RouteDyLayer")); UGString dylayerName = Translator::QStr2UGStr(("DyLabelLayer" + routeType)); UGDynamicLayer *pDyLayer = NULL; getDyLayer(pMap,pDyLayer,dylayerName); QStringList num = routeNumberList.join("\\,").split(","); int i = 0; UGStyle sty; sty.SetLineStyle(6); //设置线样式 sty.SetLineColor(getTypeColor(routeType.toInt())); //设置符号颜色 sty.SetLineWidth(1); //设置线宽度 while(!res->IsEOF()) { UGGeoLine* line = new UGGeoLine(); line->SetStyle(&sty); // pMap->m_TrackingLayer.SetSelectable(true); res->GetGeometry(pTempGeomtry); pTempGeomtry->ConvertToLine(*line); // dyRouteLayer->Add(); QString lineAlias = routeType + "_" + num.at(i); dyRouteLayer->Add(Translator::QStr2UGStr(lineAlias),line); addNodeLabel(line,pDyLayer,routeType,num.at(i)); i++; res->MoveNext(); } pMap->m_DynamicLayers.Add(pDyLayer); pMap->m_DynamicLayers.Add(dyRouteLayer); pMapEditorWnd->Refresh(); qDebug()<<"*************************:"<<(res==NULL); qDebug()<<"*************************:"; */ } // 显示三维航线 void DisplayRouteDialog::showRoute3D() { routeType = QString::number(RouteType.key(ui->RouteTypeCbbox->currentText())); QString typeFilter = "RouteType=" + routeType; QStringList routeNumberList = ui->RouteNumberCbbox->currentText().replaceInStrings(";",","); QString numFilter = "RouteNumber in (" + routeNumberList.join("\\,") + ")"; // qDebug()<<"******************************:"<MoveFirst(); UGLayer3Ds* layers = pSceneControl->GetUGLayer3Ds(); //添加到显示数据集 UGString displayDtName = addGeometry3DToDisplayDataset(res,routeType.toInt()); UGString displayLayerName = displayDtName + _U("@") + routeGVar.workspaceDataName.DatasourceName; int index = layers->FindNameInner(displayLayerName); if(index>=0) layers->TreeRemoveAt(index); //移除已存在的图层 // UGLayer3D* displayLayer = pSceneControl->AddLayerFromDataset(routeGVar.workspaceDataName.DatasourceName,displayDtName); UGLayer3D* displayLayer = layers->AddLayer(displayLayerName); UGStyle3D style3D = routeGVar.getRouteStyle3D(routeType.toInt()); displayLayer->SetStyle3D(style3D); pSceneControl->Refresh(displayLayer); displayLayer = NULL; layers = NULL; /* TrackingLayer3D显示方式 UGTrackingLayer3D* pTrackingLayer3D = pSceneControl->GetTrackingLayer3D(); if(res!=NULL) { if(routeTags.contains(routeType.toInt())) {//如果已存在该类型航线,先移除已有航线后添加 removeGeometry(routeType.toInt(),pTrackingLayer3D); } addGeometryToTrackingLayer3D(res,pTrackingLayer3D); } else { removeGeometry(routeType.toInt(),pTrackingLayer3D); } pTrackingLayer3D->SetRefresh(false); */ } //获取二维动态图层 void DisplayRouteDialog::getDyLayer(UGMap* pMap,UGDynamicLayer* &pDyLayer,UGString dyLayerName) { // qDebug()<<"***************:"<m_DynamicLayers.GetDynamicLayer(dyLayerName)==NULL) { pDyLayer = new UGDynamicLayer(); pDyLayer->SetLayerName(dyLayerName); pMap->m_DynamicLayers.Add(pDyLayer); } else { pDyLayer = pMap->m_DynamicLayers.GetDynamicLayer(dyLayerName); pDyLayer->RemoveAll(); } } //创建二维显示图层 void DisplayRouteDialog::createDisplayLayer(UGMap *pMap, UGDatasetPtr dt, QString routeType) { UGString layerName = Translator::QStr2UGStr(("RouteLayer" + routeType)); if(!pMap->m_Layers.IsLayerExisted(layerName)) pMap->m_Layers.AddDataset(dt,true,UGLayer::UG_Layer_Normal,layerName); } //添加三维对象到显示数据集 UGString DisplayRouteDialog::addGeometry3DToDisplayDataset(UGRecordsetPtr sourceRes,int routeType) { // UGVariant var; // sourceRes->MoveFirst(); // sourceRes->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteType),var); // int routeType =var.ToInt(); QString displayDtName = "ShowRoute3D_" + QString::number(routeType);//显示数据集名称 UGDataSource* ds = pSceneControl->getUGWorkspace()->GetDataSource(routeGVar.workspaceDataName.DatasourceName); if(ds->GetDataset(Translator::QStr2UGStr(displayDtName))==NULL) {//为每种航线类型创建用于显示的临时数据集,仅用于显示 MapDataManeger dataMag; UGDatasetVectorPtr dvp = dataMag.createVectorSet(ds,UGDataset::LineZ,Translator::QStr2UGStr(displayDtName)); dvp->Open(); UGFieldInfos fieldInfos; sourceRes->GetFieldInfos(fieldInfos); dvp->CreateFields(fieldInfos); } //添加到显示数据集 UGDatasetVector* dv = (UGDatasetVector*)ds->GetDataset(Translator::QStr2UGStr(displayDtName)).get(); dv->Open(); UGQueryDef queryDef; UGRecordsetPtr displayRes = dv->Query(queryDef); if(displayRes->GetRecordCount()>0) {//先清除已有几何对象。 displayRes->DeleteAll(); displayRes->Update(); } if(sourceRes->GetRecordCount()>0) { displayRes->Edit(); UGFeature* ft = NULL; while(!sourceRes->IsEOF()) { ft = sourceRes->GetFeature(); displayRes->AddFeature(ft); sourceRes->MoveNext(); } displayRes->Update(); ft = NULL; } dv = NULL; ds = NULL; return Translator::QStr2UGStr(displayDtName); } void DisplayRouteDialog::addGeometryToTrackingLayer3D(UGRecordsetPtr res, UGTrackingLayer3D *pTrackingLayer3D) { res->MoveFirst(); UGGeometry* geometry = NULL; UGGeoLine3D* line3D = NULL; UGVariant var; QString tag; QList tagList; res->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteType),var); int type = var.ToInt(); UGStyle style = routeGVar.getRouteStyle(type); style.SetAltitudeMode(AltitudeMode::Absolute); while(!res->IsEOF()) { res->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteNumber),var); res->GetGeometry(geometry); line3D = (UGGeoLine3D*) geometry; line3D->SetStyle3D(&style); tag = QString::number(type) + "_" + QString::number(var.ToInt()); qDebug()<<"*****************lineTag:"<< tag; pTrackingLayer3D->Add(line3D,Translator::QStr2UGStr(tag)); tagList.append(tag); res->MoveNext(); } routeTags.insert(type,tagList); geometry = NULL; line3D = NULL; } // 移除指定类型航线 void DisplayRouteDialog::removeGeometry(int type,UGTrackingLayer3D *pTrackingLayer3D) { QList tagList = routeTags[type]; foreach (QString tag, tagList) { pTrackingLayer3D->Remove(Translator::QStr2UGStr(tag)); } } void DisplayRouteDialog::on_RouteTypeCbbox_currentIndexChanged(int index) { routeType = QString::number(RouteType.key(ui->RouteTypeCbbox->currentText())); QString queryFilter = "RouteType=" + routeType; GeoFeatureOperator gftOpt; UGRecordsetPtr res2 = gftOpt.queryFeature(dtv,Translator::QStr2UGStr(queryFilter)); //更新航线编号选项 addRouteNumberItem(res2); // routeNumber = ui->RouteNumberCbbox->currentText(); } void DisplayRouteDialog::on_displayBtn_clicked() { if(ui->RouteNumberCbbox->currentText().isEmpty()) { QString str = "请选择要显示的航线编号!"; MessageTips *mMessageTips = new MessageTips(str,this); mMessageTips->show(); // mMessageTips = NULL; // this->reject(); return; } if(is3DMap) { showRoute3D(); } else { showRoute(); } this->accept(); } void DisplayRouteDialog::on_cancelBtn_clicked() { this->close(); }