From: rnv Date: Fri, 4 Feb 2022 22:51:47 +0000 (+0300) Subject: #26454 [EDF] (2021) SMESH: interactive mesh modification X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=refs%2Fheads%2Focc%2F26454_interactive_modif;p=modules%2Fgui.git #26454 [EDF] (2021) SMESH: interactive mesh modification --- diff --git a/src/SVTK/SVTK_Event.h b/src/SVTK/SVTK_Event.h index eae9b9a84..c45537018 100644 --- a/src/SVTK/SVTK_Event.h +++ b/src/SVTK/SVTK_Event.h @@ -71,9 +71,14 @@ namespace SVTK SetFocalPointSelected, StartFocalPointSelection, FocalPointChanged, - - OperationFinished, // rnv: invoked then SpinXY, RotateXY, DollyXY or PanXY operation is finished. + + StartInteractiveSelection, + InteractiveSelectionChanged, + InteractiveSelectionFinished, + OperationFinished, // rnv: invoked when SpinXY, RotateXY, DollyXY or PanXY operation is finished. + + StopCurrentOperation, LastEvent }; } diff --git a/src/SVTK/SVTK_InteractorStyle.cxx b/src/SVTK/SVTK_InteractorStyle.cxx index 92c2b8199..c476e6c38 100644 --- a/src/SVTK/SVTK_InteractorStyle.cxx +++ b/src/SVTK/SVTK_InteractorStyle.cxx @@ -95,7 +95,8 @@ SVTK_InteractorStyle::SVTK_InteractorStyle(): myRectBand(0), myPolygonBand(0), myPoligonState(Disable), - myIsAdvancedZoomingEnabled(false) + myIsAdvancedZoomingEnabled(false), + myInteractivePoint{0.0, 0.0, 0.0} { myPointPicker->Delete(); @@ -660,7 +661,11 @@ void SVTK_InteractorStyle::OnLeftButtonUp(int vtkNotUsed(ctrl), // finishing current viewer operation if (State != VTK_INTERACTOR_STYLE_CAMERA_NONE) { onFinishOperation(); + int lastOperation = State; startOperation(VTK_INTERACTOR_STYLE_CAMERA_NONE); + if (lastOperation == VTK_INTERACTOR_STYLE_CAMERA_INTERACTIVE_SELECTION) { + InvokeEvent(SVTK::InteractiveSelectionFinished, nullptr); + } } } @@ -685,7 +690,8 @@ void SVTK_InteractorStyle::OnMiddleButtonDown(int ctrl, startOperation(VTK_INTERACTOR_STYLE_CAMERA_NONE); } myOtherPoint = myPoint = QPoint(x, y); - if (ForcedState != VTK_INTERACTOR_STYLE_CAMERA_NONE) { + if (ForcedState != VTK_INTERACTOR_STYLE_CAMERA_NONE && + ForcedState != VTK_INTERACTOR_STYLE_CAMERA_INTERACTIVE_SELECTION) { startOperation(ForcedState); } else { @@ -743,7 +749,8 @@ void SVTK_InteractorStyle::OnRightButtonDown(int ctrl, startOperation(VTK_INTERACTOR_STYLE_CAMERA_NONE); } myOtherPoint = myPoint = QPoint(x, y); - if (ForcedState != VTK_INTERACTOR_STYLE_CAMERA_NONE) { + if (ForcedState != VTK_INTERACTOR_STYLE_CAMERA_NONE && + ForcedState != VTK_INTERACTOR_STYLE_CAMERA_INTERACTIVE_SELECTION) { startOperation(ForcedState); } else { @@ -917,6 +924,20 @@ void SVTK_InteractorStyle::startRotate() ForcedState = VTK_INTERACTOR_STYLE_CAMERA_ROTATE; } +/*! + Starts Interactive Selection operation +*/ +void SVTK_InteractorStyle::startInteractiveSelection() +{ + if (State != VTK_INTERACTOR_STYLE_CAMERA_NONE) + { + onFinishOperation(); + startOperation(VTK_INTERACTOR_STYLE_CAMERA_NONE); + } + ForcedState = VTK_INTERACTOR_STYLE_CAMERA_INTERACTIVE_SELECTION; +} + + /*! Set rotation point selected by user */ @@ -1058,6 +1079,7 @@ void SVTK_InteractorStyle::startOperation(int operation) case VTK_INTERACTOR_STYLE_CAMERA_SPIN: case VTK_INTERACTOR_STYLE_CAMERA_FIT: case VTK_INTERACTOR_STYLE_CAMERA_SELECT: + case VTK_INTERACTOR_STYLE_CAMERA_INTERACTIVE_SELECTION: if (State != VTK_INTERACTOR_STYLE_CAMERA_NONE) startOperation(VTK_INTERACTOR_STYLE_CAMERA_NONE); State = operation; @@ -1142,6 +1164,11 @@ void SVTK_InteractorStyle::onStartOperation() drawRect(); break; } + case VTK_INTERACTOR_STYLE_CAMERA_INTERACTIVE_SELECTION: + { + InteractiveSelection(); + break; + } case VTK_INTERACTOR_STYLE_CAMERA_ZOOM: case VTK_INTERACTOR_STYLE_CAMERA_PAN: case VTK_INTERACTOR_STYLE_CAMERA_ROTATE: @@ -1336,6 +1363,8 @@ void SVTK_InteractorStyle::onOperation(QPoint mousePos) drawRect(); break; } + case VTK_INTERACTOR_STYLE_CAMERA_INTERACTIVE_SELECTION: + this->InteractiveSelection(); } } @@ -1492,6 +1521,23 @@ void SVTK_InteractorStyle::IncrementalRotate( const int incrX, const int incrY ) this->RotateXY( incrX, -incrY ); } +void SVTK_InteractorStyle::InteractiveSelection() +{ + if (vtkCamera *cam = GetCurrentRenderer()->GetActiveCamera()) { + int posX, posY; + this->Interactor->GetEventPosition(posX, posY); + double viewFocus[3], z; + double* focalPointWorld = cam->GetFocalPoint(); + this->ComputeWorldToDisplay(focalPointWorld[0], focalPointWorld[1], + focalPointWorld[2], viewFocus); + z = viewFocus[2]; + + this->ComputeDisplayToWorld(double(posX), double(posY), + z, this->myInteractivePoint); + InvokeEvent(SVTK::InteractiveSelectionChanged, (void*)this->myInteractivePoint); + } +} + /*! Redefined in order to add an observer (callback) for custorm event (space mouse event) */ @@ -1538,6 +1584,8 @@ void SVTK_InteractorStyle::SetInteractor( vtkRenderWindowInteractor* theInteract theInteractor->AddObserver( SVTK::SetFocalPointGravity, EventCallbackCommand, Priority ); theInteractor->AddObserver( SVTK::StartFocalPointSelection, EventCallbackCommand, Priority ); theInteractor->AddObserver( SVTK::SetFocalPointSelected, EventCallbackCommand, Priority ); + theInteractor->AddObserver( SVTK::StartInteractiveSelection, EventCallbackCommand, Priority); + theInteractor->AddObserver( SVTK::StopCurrentOperation, EventCallbackCommand, Priority); } } @@ -1923,7 +1971,9 @@ void SVTK_InteractorStyle::ProcessEvents( vtkObject* object, case SVTK::StartFocalPointSelection: self->startFocalPointSelection(); return; - + case SVTK::StartInteractiveSelection: + self->startInteractiveSelection(); + return; case SVTK::SetFocalPointSelected: if ( self->myCurrFocalPointType == SVTK::StartFocalPointSelection ) { @@ -1935,6 +1985,9 @@ void SVTK_InteractorStyle::ProcessEvents( vtkObject* object, self->myPrevFocalPointType = self->myCurrFocalPointType; self->myCurrFocalPointType = SVTK::SetFocalPointSelected; return; + case SVTK::StopCurrentOperation: + self->onFinishOperation(); + self->startOperation(VTK_INTERACTOR_STYLE_CAMERA_NONE); } } } diff --git a/src/SVTK/SVTK_InteractorStyle.h b/src/SVTK/SVTK_InteractorStyle.h index bab239750..81cfd6d4c 100644 --- a/src/SVTK/SVTK_InteractorStyle.h +++ b/src/SVTK/SVTK_InteractorStyle.h @@ -145,6 +145,7 @@ class QtxRectRubberBand; #define VTK_INTERACTOR_STYLE_CAMERA_SELECT 6 #define VTK_INTERACTOR_STYLE_CAMERA_GLOBAL_PAN 7 #define VTK_INTERACTOR_STYLE_CAMERA_SELECT_ROTATION_POINT 8 +#define VTK_INTERACTOR_STYLE_CAMERA_INTERACTIVE_SELECTION 9 enum PolygonState { Disable, Start, InProcess, Finished, Closed, NotValid }; @@ -281,6 +282,9 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle void IncrementalRotate( const int incrX, const int incrY ); + void + InteractiveSelection(); + // Main process event method (reimplemented from #vtkInteractorStyle) static void @@ -303,6 +307,7 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle void startPointSelection(); void startFocalPointSelection(); + void startInteractiveSelection(); protected: void loadCursors(); @@ -369,6 +374,7 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle vtkSmartPointer myPointPicker; double myBBCenter[3]; + double myInteractivePoint[3]; bool myBBFirstCheck; QtxRectRubberBand* myRectBand; //!< selection rectangle rubber band diff --git a/src/SVTK/SVTK_ViewWindow.cxx b/src/SVTK/SVTK_ViewWindow.cxx index 1c3d88ae7..3719aca14 100644 --- a/src/SVTK/SVTK_ViewWindow.cxx +++ b/src/SVTK/SVTK_ViewWindow.cxx @@ -1045,6 +1045,21 @@ void SVTK_ViewWindow::activateSetFocalPointGravity() myEventDispatcher->InvokeEvent(SVTK::SetFocalPointGravity, 0); } +/*! + Activate interactive selection +*/ +void SVTK_ViewWindow::activateInteractiveSelection() +{ + myEventDispatcher->InvokeEvent(SVTK::StartInteractiveSelection, 0); +} + +/* + Deactivate current active operation +*/ +void SVTK_ViewWindow::deactivateCurrectOperation() { + myEventDispatcher->InvokeEvent(SVTK::StopCurrentOperation, 0); +} + /*! Set the selected point as a focal point */ diff --git a/src/SVTK/SVTK_ViewWindow.h b/src/SVTK/SVTK_ViewWindow.h index 49cac7f51..b92828698 100644 --- a/src/SVTK/SVTK_ViewWindow.h +++ b/src/SVTK/SVTK_ViewWindow.h @@ -328,6 +328,8 @@ public slots: void activateSetFocalPointGravity(); void activateSetFocalPointSelected(); void activateStartFocalPointSelection(); + void activateInteractiveSelection(); + void deactivateCurrectOperation(); void onViewParameters(bool theIsActivate);