增加三维航线交互式编辑功能;修改了二维航线编辑逻辑。

master
cbwu 2 years ago
parent ef1e733d75
commit 2503393f0d

@ -37,6 +37,7 @@ SOURCES += \
routeglobalvariant.cpp \
saveroutedialog.cpp \
scenecontrol.cpp \
sceneeditorwnd.cpp \
scenelayersview.cpp \
sceneview.cpp \
settingflightpoint3ddialog.cpp \
@ -74,6 +75,7 @@ HEADERS += \
routeglobalvariant.h \
saveroutedialog.h \
scenecontrol.h \
sceneeditorwnd.h \
scenelayersview.h \
sceneview.h \
settingflightpoint3ddialog.h \

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 10.0.2, 2023-06-27T09:49:04. -->
<!-- Written by QtCreator 10.0.2, 2023-06-30T15:09:24. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>

@ -2,6 +2,10 @@
#include "Geometry/UGGeoLine.h"
#include "mapdatamaneger.h"
#include "qdebug.h"
//#include <QMap>
//#include <QString>
#include <map>
#include <string>
#include "ui_displayroutedialog.h"
#include "geofeatureoperator.h"
#include "translator.h"
@ -214,7 +218,7 @@ void DisplayRouteDialog::showRoute3D()
QStringList routeNumberList = ui->RouteNumberCbbox->currentText().replaceInStrings(";",",");
QString numFilter = "RouteNumber in (" + routeNumberList.join("\\,") + ")";
qDebug()<<"******************************:"<<numFilter;
// qDebug()<<"******************************:"<<numFilter;
//图层几何对象过滤语句
UGString layerFilter = Translator::QStr2UGStr(numFilter + " and " + typeFilter);
@ -224,7 +228,8 @@ void DisplayRouteDialog::showRoute3D()
UGQueryDef queryDef;
res->GetQueryDef(queryDef);
qDebug()<<"******************************RecordCount0:"<<res->GetRecordCount();
// qDebug()<<"******************************RecordCount0:"<<res->GetRecordCount();
pSceneControl->m_mapDisplayGeometryID[routeType.toInt()] = res;
const UGString strDataName = routeGVar.workspaceDataName.Line3DDatasetName + _U("@") + routeGVar.workspaceDataName.DatasourceName;
const UGString layer3DName = _U("RouteLayer3D") + Translator::QStr2UGStr(routeType);
@ -277,22 +282,6 @@ void DisplayRouteDialog::showRoute3D()
trackingLayer3D = 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);
*/
}
//获取二维动态图层

@ -9,6 +9,7 @@
#include "Render/UGRenderObject.h"
#include "QDynamicLayer.h"
#include "QDynamicLayers.h"
#include "geofeatureoperator.h"
LayerOperator::LayerOperator()
{
@ -272,6 +273,22 @@ void LayerOperator::showKMLTemporary(QMapControl *qMapControl, UGRecordsetPtr km
pMap = NULL;
}
//显示三维航线注记
void LayerOperator::showNodeLabel3D(SceneControl* pSceneControl)
{
map<int,UGRecordsetPtr>mapDisplayGeometryIDs = pSceneControl->m_mapDisplayGeometryID;
UGRecordsetPtr res = NULL;
map<int, UGRecordsetPtr>::iterator iter;
UGTrackingLayer3D* pTrackingLayer = pSceneControl->GetTrackingLayer3D();
GeoFeatureOperator geoFOpt;
for(iter =mapDisplayGeometryIDs.begin(); iter != mapDisplayGeometryIDs.end(); iter++)
{
res = iter->second;
geoFOpt.addNodeLabel3D(res,pTrackingLayer);
};
}
//添加几何对象到三维追踪层
void LayerOperator::addGeometryToTrackingLayer3D(SceneControl *pSceneControl, UGRecordsetPtr kml3DRes)
{

@ -39,6 +39,9 @@ public:
//导入kml文件时临时显示航线
void showKMLTemporary(QMapControl* qMapControl,UGRecordsetPtr kmlRes);
//显示三维航线注记
void showNodeLabel3D(SceneControl* pSceneControl);
public: //用于三维场景的函数
//导入kml3D文件时临时显示航线
void showKML3DTemporary(SceneControl* pSceneControl,UGRecordsetPtr kml3DRes);

@ -315,13 +315,26 @@ void UGSTDCALL AfterPointInputCallback(UGlong pWnd, UGdouble &dx, UGdouble &dy,
void UGSTDCALL GeometrySelectedCallback(UGlong pWnd, UGint nSelectedGeometryCount)
{//左键点击选中触发
qDebug()<<"**************************GeometrySelectedCallback";
qDebug()<<"**************************nSelectedGeometryCount:"<<nSelectedGeometryCount;
QMapControl* pControl = (QMapControl*)pWnd;
// qDebug()<<"**************************nSelectedGeometryCount:"<<nSelectedGeometryCount;
QMapControl* pMapControl = (QMapControl*)pWnd;
if(pMapControl->getEditStatus())
{//编辑模式下设置当前选中图层可编辑
UGLayer* selectedLayer = pMapControl->getSelectionLayer();
if(!selectedLayer->IsEditable())
{
pMapControl->setEditable(pMapControl->getSelectionLayer(),true);
}
selectedLayer = NULL;
}
pMapControl = NULL;
/*
LayerOperator LO;
QMap<int,QStringList> featureInfo;
featureInfo = LO.getSelectedFeature(pControl->GetMap());
QStringList filterlist;
QList<int> types = featureInfo.keys();
for(int i = 0; i < types.size(); i++)
@ -330,6 +343,7 @@ void UGSTDCALL GeometrySelectedCallback(UGlong pWnd, UGint nSelectedGeometryCoun
}
QString filter = filterlist.join(" or ");
qDebug()<<"**************************GeometryID:"<< filter;
*/
}
@ -2349,6 +2363,35 @@ void MainWindow::Edit()
if(mapType==MapType::Map2D)
{
if(!qMapControl->getEditStatus())
{
qMapControl->setEditStatus(true);
qMapControl->GetMap()->m_Layers.ClearLayersSelection();
qMapControl->GetMap()->m_DynamicLayers.RemoveAll();
actionStartEdit->setIcon(QIcon(":/Resources/Edit.png"));
actionEditNode->setEnabled(true);
qMapControl->Refresh();
}
else
{
qMapControl->setEditStatus(false);
UGLayers* layers = &qMapControl->GetMap()->m_Layers;
UGLayer* editLayer = layers->GetEditableLayer().GetHead();
// layers->SetEditableLayer(editLayer,false);
qMapControl->setEditable(editLayer,false);
actionStartEdit->setIcon(QIcon(":/Resources/Edit1.png"));
actionEditNode->setIcon(QIcon(":/Resources/EditNode1.png"));
actionEditNode->setEnabled(false);
LayerOperator layerOpt;
layerOpt.addNodeLabel(qMapControl,editLayer->GetSelection()->ToRecordset(false));
editLayer->ClearSelection();
qMapControl->Refresh();
if(editLayer!=NULL)
qDebug()<<"****************editLayer:"<<Translator::UGStr2QStr(editLayer->GetName());
}
/*
UGLayer* editLayer = qMapControl->getSelectionLayer();
if(editLayer!=NULL)
{
@ -2356,11 +2399,11 @@ void MainWindow::Edit()
{//开启编辑
qDebug()<<"***********************OpenEdit:";
qMapControl->setEditable(editLayer,true);
actionStartEdit->setIcon(QIcon(":/Resources/Edit.png"));
// actionEditNode->setIcon(QIcon(":/Resources/EditNode.png"));
qMapControl->GetMap()->m_DynamicLayers.RemoveAll();
qMapControl->Refresh();
actionStartEdit->setIcon(QIcon(":/Resources/Edit.png"));
//actionEditNode->setIcon(QIcon(":/Resources/EditNode.png"));
actionEditNode->setEnabled(true);
}
else
@ -2378,21 +2421,52 @@ void MainWindow::Edit()
}
editLayer = NULL;
}
*/
}
else
{//三维
UGLayer3DDatasetVector* pLayer3D = (UGLayer3DDatasetVector*)pSceneControl->GetUGLayer3Ds()->AddLayer(_U("FlightLines3D@Route")); //
UGQueryDef queryDef;
queryDef.m_nOptions = UGQueryDef::Both; //查询选项:几何对象(Geometry)和属性(Attribute)都查询
queryDef.m_nType = UGQueryDef::General; //查询类型:一般的数下条件查询
queryDef.m_nMode = UGQueryDef::GeneralQuery; //查询模式:一般查询(非模糊查询)
queryDef.m_nCursorType = UGQueryDef::OpenStatic; //OpenStatic,用于读取数据OpenDynamic,用于数据增删改
queryDef.m_strFilter = _U("RouteNumber =2 and RouteType=1"); //查询条件
pLayer3D->SetDisplayFilter(queryDef);
LayerOperator layerOpt;
if(!pSceneControl->GetEditStatus())
{//开启编辑
pSceneControl->SetEditStatus(true);
pSceneControl->GetUGLayer3Ds()->ReleaseAllSelection();
pSceneControl->GetTrackingLayer3D()->RemoveAll();
actionStartEdit->setIcon(QIcon(":/Resources/Edit.png"));
// actionEditNode->setEnabled(true);
}
else
{//关闭编辑
pSceneControl->SetEditStatus(false);
pSceneControl->SetEditableLayer(pSceneControl->GetUGLayer3Ds()->GetCurrrentLayer(),false);
actionStartEdit->setIcon(QIcon(":/Resources/Edit1.png"));
actionEditNode->setIcon(QIcon(":/Resources/EditNode1.png"));
layerOpt.showNodeLabel3D(pSceneControl);
}
/*
UGLayer3D* editLayer3D = pSceneControl->GetSelectionLayer();
if(editLayer3D!=NULL)
{
if(!editLayer3D->GetEditable())
{
pSceneControl->SetEditableLayer(editLayer3D,true);
pSceneControl->GetTrackingLayer3D()->RemoveAll();
actionStartEdit->setIcon(QIcon(":/Resources/Edit.png"));
actionEditNode->setEnabled(true);
qDebug()<<"*********************EditLayerName1:"<<Translator::UGStr2QStr(pSceneControl->GetUGLayer3Ds()->GetCurrrentLayer()->GetName());
}
else
{
pSceneControl->SetEditableLayer(editLayer3D,false);
actionStartEdit->setIcon(QIcon(":/Resources/Edit1.png"));
actionEditNode->setIcon(QIcon(":/Resources/EditNode1.png"));
actionEditNode->setEnabled(false);
}
}
*/
qDebug()<<"*********************1:"<<pSceneControl->GetUGLayer3Ds()->GetInnerCount();
// qDebug()<<"*********************1:"<<pSceneControl->GetUGLayer3Ds()->GetInnerCount();
}
}

@ -104,7 +104,8 @@ void SceneControl::Initialize(void* pWndHandle, int dpiX, int dpiY)
UGuint SceneControl::getKeyUGFlags(unsigned int flag)
{
UGint flags = 0;
if(flag & UG_VK_MENU || flag & UG_VK_SHIFT || flag & UG_VK_CONTROL){
if(flag & UG_VK_MENU || flag & UG_VK_SHIFT || flag & UG_VK_CONTROL)
{
flags = flag; // TODO: change
}
@ -137,9 +138,13 @@ void SceneControl::OnSizeChanged(int x, int y, void* pHDC)
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);
@ -163,9 +168,15 @@ void SceneControl::OnLMouseUp(unsigned int nFlags, int x, int y, void* pHDC)
void SceneControl::OnLMouseDbClick(unsigned int nFlags, int x, int y, void* pHDC)
{
UGPoint pt(x, y);
UGC::UGuint flag = getKeyUGFlags(nFlags);
m_pUGSceneWnd->OnLButtonDblClk(flag, pt);
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)
@ -173,10 +184,15 @@ 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)
{
}
// qDebug()<<"*******x:"<<x;
// qDebug()<<"*******y:"<<y;
// qDebug()<<"************";
// m_pUGSceneWnd->m_SceneWindow.OnMouseMove(flag, pt);
// qDebug()<<"****************3DCursorShape:"<<m_pUGSceneWnd->GetUserAction();
// qDebug()<<"****************3DCursorShape:"<<m_pUGSceneWnd->Get3DCursorShape();
// m_pUGSceneWnd->Refresh();
}
@ -326,6 +342,26 @@ 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)

@ -8,6 +8,7 @@
//#include "exportsDefine.h"
//#include <QObject>
#include "sceneeditorwnd.h"
#include "Engine/UGRecordset.h"
#include "MapEditor/UGMapEditorWnd.h"
#include "Graphics/UGGraphicsManager.h"
@ -25,6 +26,9 @@
#include "Layer3DDataset/UGLayer3DDatasetVectorPoint.h"
#include "Layer3DDataset/UGLayer3DDatasetVectorLR.h"
#include <map>
#include <string>
namespace UGC
{
class UGWorkspace;
@ -77,6 +81,7 @@ using namespace UGC;
bool mIsInWorkspace;
static bool mIsInitializeUGRoot3D;
// methods
private:
void Initialize(void* pWndHandle, int dpiX, int dpiY);
@ -201,6 +206,24 @@ using namespace UGC;
*/
void SetEditableLayer(UGLayer3D* pLayer, bool isEditable);
/*
* @cbwu
* @brief set selected layer editable
*/
void SetSelectionLayerEditable(bool isEditable=true);
/*
* @cbwu
* @brief
*/
bool GetEditStatus();
/*
* @cbwu
* @brief
*/
void SetEditStatus(bool isEditable);
public:
/*
* @en
@ -258,6 +281,7 @@ using namespace UGC;
*/
UGLayer3D* GetSelectionLayer();
// 获取所有选中对象的选择集。通常情况下,使用点击选择对象,只有个图层有选中对象,因此只有一个选择集
// 若没有选中对象返回NULL; 不需要使用时请先RemoveAll(), 再delete
UGArray<UGSelection3D*>* GetGeoSelections();
@ -290,6 +314,13 @@ using namespace UGC;
MessureAngle
};
// bool startTracking = false;
bool m_EditStatus = false;
/*
*@cbwu
*@brief
*/
std::map<int,UGRecordsetPtr>m_mapDisplayGeometryID;
public:
void removeLayer3D(UGString layerName);

@ -0,0 +1,14 @@
#include "sceneeditorwnd.h"
#include "Scene/UGScene3D.h"
SceneEditorWnd::SceneEditorWnd(UGScene3D *pScene3D):UGSceneEditorWnd(pScene3D) //调用父类的构造函数
{
}
UGEditToolPack3D *SceneEditorWnd::GetEditToolPack3D()
{
return &this->m_EditToolPack3D;
}

@ -0,0 +1,21 @@
/*
*@cbwu
*@brief UGSceneEditorWndUGEditToolPack3D
*/
#ifndef SCENEEDITORWND_H
#define SCENEEDITORWND_H
#include "SceneEditor/UGSceneEditorWnd.h"
#include "SceneEditor/UGEditToolPack3D.h"
using namespace UGC;
//暂时未使用
//继承UGSceneEditorWnd以获取其protected属性和方法
class SceneEditorWnd:public UGSceneEditorWnd
{
public:
SceneEditorWnd(UGScene3D *pScene3D);
UGEditToolPack3D* GetEditToolPack3D();
};
#endif // SCENEEDITORWND_H

@ -1,4 +1,5 @@
#include "SceneView.h"
#include "translator.h"
void UGSTDCALL Action3DChangedCallBack(UGlong pWnd, UGSceneUserAction oldAction,UGSceneUserAction newAction)
{
@ -69,6 +70,45 @@ void UGSTDCALL Tracked3DCallBack(UGlong pWnd, UGGeometry *pGeometry, UGdouble dL
}
void UGSTDCALL VertexModifiedCallBack(UGlong pWnd,UGPoint3D pntPosition,UGbool bMoveZ,
UGint nPointID,UGint nGeometryID,UGLayer3D *pLayer)
{
// qDebug()<<"*************************VertexModifiedCallBack";
// qDebug()<<"*************************nPointID:"<<nPointID;
}
void UGSTDCALL DynamicSelected3DCallBack(UGlong pWnd, UGString strLayerName, UGint nGeometryID)
{
qDebug()<<"*************************strLayerNameCallBack:"<<Translator::UGStr2QStr(strLayerName);
}
void UGSTDCALL GeometrySelected3DCallBack(UGlong pWnd,UGint nSelectedGeometryCount)
{
qDebug()<<"*************************GeometrySelected3DCallBack:"<<nSelectedGeometryCount;
SceneView* pSceneView = (SceneView*)pWnd;
SceneControl* pSceneControl = pSceneView->GetSceneControl();
if(pSceneControl->GetEditStatus())
{//编辑模式下,设置选中对象所在图层为可编辑。
pSceneControl->SetSelectionLayerEditable(true);
};
pSceneView = NULL;
pSceneControl = NULL;
};
void UGSTDCALL GeometrySelectChanged3DCallBack(UGlong pWnd,UGint nSelectedGeometryCount)
{
qDebug()<<"*************************GeometrySelectChanged3DCallBack:";
};
void UGSTDCALL AfterGeometry3DModifiedCallBack(
UGlong pWnd,
UGint nGeometryID,
UGLayer3D *pLayer)
{
qDebug()<<"*************************AfterGeometry3DModifiedCallBack-nGeometryID:"<<nGeometryID;
};
SceneView::SceneView(QWidget *parent) : QWidget(parent)
{
m_pSceneControl = NULL;
@ -89,7 +129,13 @@ SceneView::SceneView(QWidget *parent) : QWidget(parent)
m_pSceneControl->GetSceneEditWnd()->m_SceneWindow.SetTracking3DFunc(Tracking3DCallBack,(UGlong)this);
m_pSceneControl->GetSceneEditWnd()->m_SceneWindow.SetTracked3DFunc(Tracked3DCallBack,(UGlong)this);
m_pSceneControl->GetSceneEditWnd()->m_SceneWindow.SetAction3DChangedFunc(Action3DChangedCallBack,(UGlong)this);
// pSceneLayersView = new SceneLayersView();
// m_pSceneControl->GetSceneEditWnd()->SetVertexModifiedFunc(VertexModifiedCallBack,(UGlong)this);
m_pSceneControl->GetSceneEditWnd()->SetVertexSelectedFunc(VertexModifiedCallBack,(UGlong)this);
m_pSceneControl->GetScene3D()->SetDynamicSelected3DFunc(DynamicSelected3DCallBack,(UGlong)this);
m_pSceneControl->GetScene3D()->SetGeometrySelected3DFunc(GeometrySelected3DCallBack,(UGlong)this);
// m_pSceneControl->GetScene3D()->SetGeometrySelectChanged3DFunc(GeometrySelectChanged3DCallBack,(UGlong)this);
m_pSceneControl->GetSceneEditWnd()->SetAfterGeometry3DModifiedFunc(AfterGeometry3DModifiedCallBack,(UGlong)this);
// pSceneLayersView = new SceneLayersView();
isEditStateFlag = false;
}
@ -130,6 +176,7 @@ void SceneView::ReviseCursor(int SceneUserAction)
switch (SceneUserAction) {
case UGSceneUserAction::suaPan:
setCursor(QCursor(QPixmap(":/Resources/Pan2.png")));
// setCursor(QCursor(Qt::OpenHandCursor));
case UGSceneUserAction::suaPanSelect:
setCursor(QCursor(QPixmap(":/Resources/Pan.png")));
break;
@ -172,12 +219,12 @@ void SceneView::ReviseCursor(int SceneUserAction)
}
case UG3DCursorShape::ecPan:
{
setCursor(QCursor(QPixmap(":/Resources/Pan.png")));
setCursor(QCursor(Qt::OpenHandCursor));
break;
}
case UG3DCursorShape::ecPanMove:
{
setCursor(QCursor(QPixmap(":/Resources/Pan2.png")));
setCursor(QCursor(Qt::ClosedHandCursor));
break;
}
case UG3DCursorShape::ecZoomIn:
@ -327,7 +374,16 @@ void SceneView::keyPressEvent(QKeyEvent* event)
void SceneView::mouseDoubleClickEvent(QMouseEvent *event)
{
int flag = getMouseOrKeyFlag(event);
if(event->button() == Qt::LeftButton)
{
// qDebug()<<"**************************LDoubleClickEvent"<<flag;
m_pSceneControl->OnLMouseDbClick(flag,event->x(),event->y());
}
else if(event->button() == Qt::RightButton)
{
}
}
SceneControl* SceneView::GetSceneControl()

@ -31,6 +31,11 @@ public:
bool startTrackingFlag; //开始绘制追踪
bool isEditStateFlag; //编辑状态
/*
*@cbwu
*@brief
*/
// QMap<int,QString>m_qmapDisplayGeometryID;
//method

Loading…
Cancel
Save