diff --git a/MapDisplay.pro b/MapDisplay.pro index 4e73d478..1ae3afd6 100644 --- a/MapDisplay.pro +++ b/MapDisplay.pro @@ -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 \ diff --git a/MapDisplay.pro.user b/MapDisplay.pro.user index 8d937b09..a7f7efeb 100644 --- a/MapDisplay.pro.user +++ b/MapDisplay.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/displayroutedialog.cpp b/displayroutedialog.cpp index 1659eb24..03e5e137 100644 --- a/displayroutedialog.cpp +++ b/displayroutedialog.cpp @@ -2,6 +2,10 @@ #include "Geometry/UGGeoLine.h" #include "mapdatamaneger.h" #include "qdebug.h" +//#include +//#include +#include +#include #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()<<"******************************:"<GetQueryDef(queryDef); - qDebug()<<"******************************RecordCount0:"<GetRecordCount(); +// qDebug()<<"******************************RecordCount0:"<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); - */ } //获取二维动态图层 diff --git a/layeroperator.cpp b/layeroperator.cpp index ccc86cbf..cec53bc6 100644 --- a/layeroperator.cpp +++ b/layeroperator.cpp @@ -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) +{ + mapmapDisplayGeometryIDs = pSceneControl->m_mapDisplayGeometryID; + UGRecordsetPtr res = NULL; + map::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) { diff --git a/layeroperator.h b/layeroperator.h index 01bae88a..e61aa42d 100644 --- a/layeroperator.h +++ b/layeroperator.h @@ -39,6 +39,9 @@ public: //导入kml文件时临时显示航线 void showKMLTemporary(QMapControl* qMapControl,UGRecordsetPtr kmlRes); + //显示三维航线注记 + void showNodeLabel3D(SceneControl* pSceneControl); + public: //用于三维场景的函数 //导入kml3D文件时临时显示航线 void showKML3DTemporary(SceneControl* pSceneControl,UGRecordsetPtr kml3DRes); diff --git a/mainwindow.cpp b/mainwindow.cpp index ed95f129..8716814d 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -315,13 +315,26 @@ void UGSTDCALL AfterPointInputCallback(UGlong pWnd, UGdouble &dx, UGdouble &dy, void UGSTDCALL GeometrySelectedCallback(UGlong pWnd, UGint nSelectedGeometryCount) {//左键点击选中触发 qDebug()<<"**************************GeometrySelectedCallback"; - qDebug()<<"**************************nSelectedGeometryCount:"<getEditStatus()) + {//编辑模式下设置当前选中图层可编辑 + UGLayer* selectedLayer = pMapControl->getSelectionLayer(); + if(!selectedLayer->IsEditable()) + { + pMapControl->setEditable(pMapControl->getSelectionLayer(),true); + } + + selectedLayer = NULL; + } + + pMapControl = NULL; + + /* LayerOperator LO; QMap featureInfo; featureInfo = LO.getSelectedFeature(pControl->GetMap()); - QStringList filterlist; QList 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:"<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:"<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:"<GetUGLayer3Ds()->GetInnerCount(); +// qDebug()<<"*********************1:"<GetUGLayer3Ds()->GetInnerCount(); } } diff --git a/scenecontrol.cpp b/scenecontrol.cpp index 66aaee46..f1742d84 100644 --- a/scenecontrol.cpp +++ b/scenecontrol.cpp @@ -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:"<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:"<m_SceneWindow.OnMouseMove(flag, pt); +// qDebug()<<"****************3DCursorShape:"<GetUserAction(); // qDebug()<<"****************3DCursorShape:"<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) diff --git a/scenecontrol.h b/scenecontrol.h index 3ee1d7be..abfb0f0f 100644 --- a/scenecontrol.h +++ b/scenecontrol.h @@ -8,6 +8,7 @@ //#include "exportsDefine.h" //#include +#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 +#include + 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* GetGeoSelections(); @@ -290,6 +314,13 @@ using namespace UGC; MessureAngle }; // bool startTracking = false; + bool m_EditStatus = false; + /* + *@cbwu + *@brief 存储显示的几何对象集合 + */ + std::mapm_mapDisplayGeometryID; + public: void removeLayer3D(UGString layerName); diff --git a/sceneeditorwnd.cpp b/sceneeditorwnd.cpp new file mode 100644 index 00000000..2ef3e99d --- /dev/null +++ b/sceneeditorwnd.cpp @@ -0,0 +1,14 @@ +#include "sceneeditorwnd.h" +#include "Scene/UGScene3D.h" + + +SceneEditorWnd::SceneEditorWnd(UGScene3D *pScene3D):UGSceneEditorWnd(pScene3D) //调用父类的构造函数 +{ + +} + +UGEditToolPack3D *SceneEditorWnd::GetEditToolPack3D() +{ + return &this->m_EditToolPack3D; + +} diff --git a/sceneeditorwnd.h b/sceneeditorwnd.h new file mode 100644 index 00000000..ba73d027 --- /dev/null +++ b/sceneeditorwnd.h @@ -0,0 +1,21 @@ +/* + *@cbwu + *@brief 继承UGSceneEditorWnd类,以获取UGEditToolPack3D方法 + */ + +#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 diff --git a/sceneview.cpp b/sceneview.cpp index c4625bd6..fe3af609 100644 --- a/sceneview.cpp +++ b/sceneview.cpp @@ -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:"<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:"<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"<OnLMouseDbClick(flag,event->x(),event->y()); + } + else if(event->button() == Qt::RightButton) + { + } } SceneControl* SceneView::GetSceneControl() diff --git a/sceneview.h b/sceneview.h index 9bd10cdf..50d1f766 100644 --- a/sceneview.h +++ b/sceneview.h @@ -31,6 +31,11 @@ public: bool startTrackingFlag; //开始绘制追踪 bool isEditStateFlag; //编辑状态 + /* + *@cbwu + *@brief 存储显示的几何对象集合 + */ +// QMapm_qmapDisplayGeometryID; //method