X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSVTK%2FSVTK_InteractorStyle.cxx;h=cd5396b4261a85e212bf36b2c5376d81b5881216;hb=refs%2Fheads%2Fngr%2Fpython3_dev_pv5.4;hp=e7026d8c63f7ac04f1ef9fa44c21609498ad653c;hpb=e07448c48ea5b2127e34fc7b8c3427d01c7ce17b;p=modules%2Fgui.git diff --git a/src/SVTK/SVTK_InteractorStyle.cxx b/src/SVTK/SVTK_InteractorStyle.cxx index e7026d8c6..cd5396b42 100644 --- a/src/SVTK/SVTK_InteractorStyle.cxx +++ b/src/SVTK/SVTK_InteractorStyle.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -56,9 +57,11 @@ #include #include +#include + #include #include -#include +#include #include #include @@ -90,7 +93,9 @@ SVTK_InteractorStyle::SVTK_InteractorStyle(): myControllerOnKeyDown(SVTK_ControllerOnKeyDown::New()), myHighlightSelectionPointActor(SVTK_Actor::New()), myRectBand(0), - myIsAdvancedZoomingEnabled(false) + myPolygonBand(0), + myIsAdvancedZoomingEnabled(false), + myPoligonState( Disable ) { myPointPicker->Delete(); @@ -138,6 +143,7 @@ SVTK_InteractorStyle::SVTK_InteractorStyle(): SVTK_InteractorStyle::~SVTK_InteractorStyle() { endDrawRect(); + endDrawPolygon(); } /*! @@ -156,6 +162,15 @@ SVTK_Selector* SVTK_InteractorStyle::GetSelector() return myInteractor->GetSelector(); } +/*! + Realeaze actors +*/ +void SVTK_InteractorStyle::FreeActors() +{ + myLastHighlitedActor = NULL; + myLastPreHighlitedActor = NULL; +} + /*! Generate special SVTK_SelectionEvent */ @@ -224,7 +239,7 @@ void SVTK_InteractorStyle::RotateXY(int dx, int dy) if ( myCurrRotationPointType == SVTK::SetRotateGravity ) { - vtkFloatingPointType aCenter[3]; + double aCenter[3]; if ( ComputeBBCenter(GetCurrentRenderer(),aCenter) ) { myRotationPointX = aCenter[0]; @@ -261,6 +276,7 @@ void SVTK_InteractorStyle::RotateXY(int dx, int dy) // To apply the transformation cam->SetPosition(aTransform->TransformPoint(viewPos)); cam->SetFocalPoint(aTransform->TransformPoint(viewFP)); + aTransform->Delete(); cam->OrthogonalizeViewUp(); @@ -450,6 +466,17 @@ void SVTK_InteractorStyle::OnMouseWheelBackward() myOtherPoint = QPoint(x, y); } +/*! + To handle mouse double click event +*/ +void SVTK_InteractorStyle::OnMouseButtonDoubleClick() +{ + if( myPoligonState == InProcess ) { + onFinishOperation(); + myPoligonState = Finished; + } +} + /*! To handle mouse move event */ @@ -457,6 +484,12 @@ void SVTK_InteractorStyle::OnMouseMove(int vtkNotUsed(ctrl), int shift, int x, int y) { + if ( myPoligonState == Start ) { + // if right button was pressed and mouse is moved + // we can to draw a polygon for polygonal selection + myPoligonState = InProcess; + startOperation( VTK_INTERACTOR_STYLE_CAMERA_SELECT ); + } myShiftState = shift; if (State != VTK_INTERACTOR_STYLE_CAMERA_NONE) onOperation(QPoint(x, y)); @@ -474,6 +507,9 @@ void SVTK_InteractorStyle::OnLeftButtonDown(int ctrl, int shift, if(GetCurrentRenderer() == NULL) return; + if ( myPoligonState != Disable ) + return; + myShiftState = shift; // finishing current viewer operation if (State != VTK_INTERACTOR_STYLE_CAMERA_NONE) { @@ -501,22 +537,61 @@ void SVTK_InteractorStyle::OnLeftButtonDown(int ctrl, int shift, { if( SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( aVTKActor ) ) { - SVTK::TPickLimiter aPickLimiter( myPointPicker, anActor ); - myPointPicker->Pick( aSelectionEvent->myX, - aSelectionEvent->myY, - 0.0, + Selection_Mode aSelectionMode = GetSelector()->SelectionMode(); + double* aCoords; + int aVtkId; + bool isTrueType = false; + + if( myCurrFocalPointType == SVTK::StartFocalPointSelection || + ( myCurrRotationPointType == SVTK::StartPointSelection && aSelectionMode == NodeSelection ) ) + { + SVTK::TPickLimiter aPickLimiter( myPointPicker, anActor ); + myPointPicker->Pick( aSelectionEvent->myX, + aSelectionEvent->myY, + 0.0, + GetCurrentRenderer() ); + aVtkId = myPointPicker->GetPointId(); + if ( aVtkId >= 0 ) + { + int anObjId = anActor->GetNodeObjId( aVtkId ); + aCoords = anActor->GetNodeCoord(anObjId); + isTrueType = true; + } + } + + if( aSelectionMode == EdgeSelection || aSelectionMode == FaceSelection || aSelectionMode == VolumeSelection ) + { + vtkSmartPointer aCellPicker = vtkCellPicker::New(); + aCellPicker->SetTolerance( 0.005 ); + SVTK::TPickLimiter aPickLimiter( aCellPicker, anActor ); + aCellPicker->Pick( aSelectionEvent->myX, + aSelectionEvent->myY, + 0.0, GetCurrentRenderer() ); - int aVtkId = myPointPicker->GetPointId(); - if ( aVtkId >= 0 ) - { - int anObjId = anActor->GetNodeObjId( aVtkId ); - vtkFloatingPointType* aCoords = anActor->GetNodeCoord(anObjId); - + aVtkId = aCellPicker->GetCellId(); + int aCellId = anActor->GetElemObjId( aVtkId ); + + if( aSelectionMode == EdgeSelection ) + isTrueType = anActor->GetObjDimension( aCellId ) == 1; + else if( aSelectionMode == FaceSelection ) + isTrueType = anActor->GetObjDimension( aCellId ) == 2; + else if( aSelectionMode == VolumeSelection ) + isTrueType = anActor->GetObjDimension( aCellId ) == 3; + + if ( aVtkId >= 0 && isTrueType ) + aCoords = anActor->GetGravityCenter( aCellId ); + } + + if( aVtkId >= 0 ) + { if (myCurrRotationPointType == SVTK::StartPointSelection) { myCurrRotationPointType = SVTK::SetRotateSelected; - // invoke event for update coordinates in SVTK_SetRotationPointDlg - InvokeEvent(SVTK::RotationPointChanged,(void*)aCoords); + if( isTrueType ) + InvokeEvent(SVTK::RotationPointChanged,(void*)aCoords); + else + InvokeEvent(SVTK::RotationPointChanged); + GetSelector()->SetSelectionMode(ActorSelection); } else if (myCurrFocalPointType == SVTK::StartFocalPointSelection) { myCurrFocalPointType = SVTK::SetFocalPointSelected; @@ -538,6 +613,7 @@ void SVTK_InteractorStyle::OnLeftButtonDown(int ctrl, int shift, // invoke event with no data (for SVTK_SetRotationPointDlg) InvokeEvent(SVTK::RotationPointChanged,0); myCurrRotationPointType = myPrevRotationPointType; + GetSelector()->SetSelectionMode(ActorSelection); } else if (myCurrFocalPointType == SVTK::StartFocalPointSelection) { // invoke event with no data (for SVTK_ViewParameterDlg) @@ -564,10 +640,23 @@ void SVTK_InteractorStyle::OnLeftButtonDown(int ctrl, int shift, */ void SVTK_InteractorStyle::OnLeftButtonUp(int vtkNotUsed(ctrl), int shift, - int vtkNotUsed(x), - int vtkNotUsed(y)) + int x, + int y) { myShiftState = shift; + if( myPoligonState == InProcess ) { // add a new point of polygon + myPolygonPoints.append( QPoint( x, y ) ); + this->Interactor->GetEventPosition( mySelectionEvent->myX, mySelectionEvent->myY ); + mySelectionEvent->myPolygonPoints.append( QPoint( mySelectionEvent->myX, mySelectionEvent->myY ) ); + return; + } + else if ( myPoligonState == Closed ) { // close polygon and apply a selection + onFinishOperation(); + myPoligonState = Finished; + return; + } + else if( myPoligonState == Finished || myPoligonState == NotValid ) + return; // finishing current viewer operation if (State != VTK_INTERACTOR_STYLE_CAMERA_NONE) { onFinishOperation(); @@ -586,6 +675,9 @@ void SVTK_InteractorStyle::OnMiddleButtonDown(int ctrl, if(GetCurrentRenderer() == NULL) return; + if ( myPoligonState != Disable ) + return; + myShiftState = shift; // finishing current viewer operation if (State != VTK_INTERACTOR_STYLE_CAMERA_NONE) { @@ -611,6 +703,13 @@ void SVTK_InteractorStyle::OnMiddleButtonUp(int vtkNotUsed(ctrl), int vtkNotUsed(x), int vtkNotUsed(y)) { + if( myPoligonState == InProcess ) { // delete a point of polygon + if ( myPolygonPoints.size() > 2 ) { + myPolygonPoints.remove( myPolygonPoints.size() - 1 ); + mySelectionEvent->myPolygonPoints.remove( mySelectionEvent->myPolygonPoints.size() - 1 ); + } + return; + } myShiftState = shift; // finishing current viewer operation if (State != VTK_INTERACTOR_STYLE_CAMERA_NONE) { @@ -632,6 +731,12 @@ void SVTK_InteractorStyle::OnRightButtonDown(int ctrl, return; myShiftState = shift; + + if ( !ctrl ) { + myPoligonState = Start; + this->Interactor->GetEventPosition(mySelectionEvent->myX, mySelectionEvent->myY); + mySelectionEvent->myPolygonPoints.append( QPoint( mySelectionEvent->myX, mySelectionEvent->myY) ); + } // finishing current viewer operation if (State != VTK_INTERACTOR_STYLE_CAMERA_NONE) { onFinishOperation(); @@ -655,6 +760,18 @@ void SVTK_InteractorStyle::OnRightButtonUp(int vtkNotUsed(ctrl), int vtkNotUsed(x), int vtkNotUsed(y)) { + if( myPoligonState == Start ) { // if right button was pressed but mouse is not moved + myPoligonState = Disable; + mySelectionEvent->myPolygonPoints.clear(); + } + + if( myPoligonState != Disable ) { + endDrawPolygon(); + myPoligonState = Finished; + startOperation(VTK_INTERACTOR_STYLE_CAMERA_NONE); + return; + } + myShiftState = shift; // finishing current viewer operation if (State != VTK_INTERACTOR_STYLE_CAMERA_NONE) { @@ -809,7 +926,7 @@ void SVTK_InteractorStyle::startPointSelection() if(GetCurrentRenderer() != NULL) { GetCurrentRenderer()->AddActor( myHighlightSelectionPointActor.GetPointer() ); - vtkFloatingPointType aColor[3]; + double aColor[3]; GetCurrentRenderer()->GetBackground( aColor ); myHighlightSelectionPointActor->GetProperty()->SetColor(1. - aColor[0], 1. - aColor[1], @@ -828,7 +945,7 @@ void SVTK_InteractorStyle::startFocalPointSelection() if(GetCurrentRenderer() != NULL) { GetCurrentRenderer()->AddActor( myHighlightSelectionPointActor.GetPointer() ); - vtkFloatingPointType aColor[3]; + double aColor[3]; GetCurrentRenderer()->GetBackground( aColor ); myHighlightSelectionPointActor->GetProperty()->SetColor(1. - aColor[0], 1. - aColor[1], @@ -1019,7 +1136,10 @@ void SVTK_InteractorStyle::onStartOperation() case VTK_INTERACTOR_STYLE_CAMERA_SELECT: case VTK_INTERACTOR_STYLE_CAMERA_FIT: { - drawRect(); + if ( myPoligonState == InProcess ) + drawPolygon(); + else + drawRect(); break; } case VTK_INTERACTOR_STYLE_CAMERA_ZOOM: @@ -1066,78 +1186,91 @@ void SVTK_InteractorStyle::onFinishOperation() } else { if (myPoint == myOtherPoint) - { - // process point selection - this->FindPokedRenderer(aSelectionEvent->myX, aSelectionEvent->myY); - Interactor->StartPickCallback(); + { + // process point selection + this->FindPokedRenderer(aSelectionEvent->myX, aSelectionEvent->myY); + Interactor->StartPickCallback(); - SALOME_Actor* aHighlightedActor = NULL; - vtkActorCollection* anActorCollection = GetSelector()->Pick(aSelectionEvent, GetCurrentRenderer()); - - aSelectionEvent->myIsRectangle = false; + SALOME_Actor* aHighlightedActor = NULL; + vtkActorCollection* anActorCollection = GetSelector()->Pick(aSelectionEvent, GetCurrentRenderer()); - if(!myShiftState) - GetSelector()->ClearIObjects(); + aSelectionEvent->myIsRectangle = false; + aSelectionEvent->myIsPolygon = false; + if(!myShiftState) + GetSelector()->ClearIObjects(); - if( anActorCollection ) + if( anActorCollection ) + { + if( !myShiftState && + anActorCollection->GetNumberOfItems () > 1 && + myLastHighlitedActor.GetPointer() ) { + anActorCollection->RemoveItem ( myLastHighlitedActor.GetPointer() ); + } + anActorCollection->InitTraversal(); + while( vtkActor* aVTKActor = anActorCollection->GetNextActor() ) { - anActorCollection->InitTraversal(); - while( vtkActor* aVTKActor = anActorCollection->GetNextActor() ) + if( SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( aVTKActor ) ) { - if( SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( aVTKActor ) ) + if( anActor->Highlight( this, aSelectionEvent, true ) ) { - if( anActor->Highlight( this, aSelectionEvent, true ) ) - { - aHighlightedActor = anActor; - break; - } + aHighlightedActor = anActor; + break; } } } + } - if( !aHighlightedActor ) - { - if(myLastHighlitedActor.GetPointer() && myLastHighlitedActor.GetPointer() != aHighlightedActor) - myLastHighlitedActor->Highlight( this, aSelectionEvent, false ); - } - myLastHighlitedActor = aHighlightedActor; - } - else + if( !aHighlightedActor ) { - //processing rectangle selection - Interactor->StartPickCallback(); - GetSelector()->StartPickCallback(); + if(myLastHighlitedActor.GetPointer() && myLastHighlitedActor.GetPointer() != aHighlightedActor) + myLastHighlitedActor->Highlight( this, aSelectionEvent, false ); + } + myLastHighlitedActor = aHighlightedActor; + } + else + { + if ( myPoligonState == InProcess || myPoligonState == Closed ) + aSelectionEvent->myIsPolygon = true; + else aSelectionEvent->myIsRectangle = true; - if(!myShiftState) - GetSelector()->ClearIObjects(); + //processing polygonal selection + Interactor->StartPickCallback(); + GetSelector()->StartPickCallback(); + + if(!myShiftState) + GetSelector()->ClearIObjects(); - VTK::ActorCollectionCopy aCopy(GetCurrentRenderer()->GetActors()); - vtkActorCollection* aListActors = aCopy.GetActors(); - aListActors->InitTraversal(); - while(vtkActor* aActor = aListActors->GetNextActor()) + VTK::ActorCollectionCopy aCopy(GetCurrentRenderer()->GetActors()); + vtkActorCollection* aListActors = aCopy.GetActors(); + aListActors->InitTraversal(); + while(vtkActor* aActor = aListActors->GetNextActor()) + { + if(aActor->GetVisibility()) + { + if(SALOME_Actor* aSActor = SALOME_Actor::SafeDownCast(aActor)) { - if(aActor->GetVisibility()) - { - if(SALOME_Actor* aSActor = SALOME_Actor::SafeDownCast(aActor)) - { - if(aSActor->hasIO()) - aSActor->Highlight( this, aSelectionEvent, true ); - } - } + if(aSActor->hasIO()) + aSActor->Highlight( this, aSelectionEvent, true ); } + } } + } + aSelectionEvent->myIsRectangle = false; + aSelectionEvent->myIsPolygon = false; + aSelectionEvent->myPolygonPoints.clear(); + endDrawPolygon(); Interactor->EndPickCallback(); GetSelector()->EndPickCallback(); } - } - break; - case VTK_INTERACTOR_STYLE_CAMERA_ZOOM: - case VTK_INTERACTOR_STYLE_CAMERA_PAN: - case VTK_INTERACTOR_STYLE_CAMERA_ROTATE: - case VTK_INTERACTOR_STYLE_CAMERA_SPIN: - break; - case VTK_INTERACTOR_STYLE_CAMERA_GLOBAL_PAN: + break; + } + case VTK_INTERACTOR_STYLE_CAMERA_ZOOM: + case VTK_INTERACTOR_STYLE_CAMERA_PAN: + case VTK_INTERACTOR_STYLE_CAMERA_ROTATE: + case VTK_INTERACTOR_STYLE_CAMERA_SPIN: + break; + case VTK_INTERACTOR_STYLE_CAMERA_GLOBAL_PAN: { int w, h, x, y; Interactor->GetSize(w, h); @@ -1197,7 +1330,10 @@ void SVTK_InteractorStyle::onOperation(QPoint mousePos) case VTK_INTERACTOR_STYLE_CAMERA_FIT: { myOtherPoint = mousePos; - drawRect(); + if ( myPoligonState == InProcess || myPoligonState == Closed || myPoligonState == NotValid ) + drawPolygon(); + else if ( myPoligonState != Finished ) + drawRect(); break; } } @@ -1209,6 +1345,9 @@ void SVTK_InteractorStyle::onOperation(QPoint mousePos) */ void SVTK_InteractorStyle::onCursorMove(QPoint mousePos) { + if ( !GetSelector()->IsPreSelectionEnabled() ) + return; + // processing highlighting SVTK_SelectionEvent* aSelectionEvent = GetSelectionEventFlipY(); this->FindPokedRenderer(aSelectionEvent->myX,aSelectionEvent->myY); @@ -1218,8 +1357,7 @@ void SVTK_InteractorStyle::onCursorMove(QPoint mousePos) SALOME_Actor* aPreHighlightedActor = NULL; vtkActorCollection* anActorCollection = GetSelector()->Pick(aSelectionEvent, GetCurrentRenderer()); - if ( myCurrRotationPointType == SVTK::StartPointSelection || - myCurrFocalPointType == SVTK::StartFocalPointSelection ) + if ( myCurrFocalPointType == SVTK::StartFocalPointSelection ) { myHighlightSelectionPointActor->SetVisibility( false ); @@ -1312,7 +1450,7 @@ void SVTK_InteractorStyle::TranslateView(int toX, int toY, int fromX, int fromY) vtkCamera *cam = GetCurrentRenderer()->GetActiveCamera(); double viewFocus[4], focalDepth, viewPoint[3]; - vtkFloatingPointType newPickPoint[4], oldPickPoint[4], motionVector[3]; + double newPickPoint[4], oldPickPoint[4], motionVector[3]; cam->GetFocalPoint(viewFocus); this->ComputeWorldToDisplay(viewFocus[0], viewFocus[1], @@ -1413,7 +1551,7 @@ void SVTK_InteractorStyle::OnTimer() // check if bounding box was changed if ( GetCurrentRenderer() ) { - vtkFloatingPointType aCurrBBCenter[3]; + double aCurrBBCenter[3]; if ( ComputeBBCenter(GetCurrentRenderer(),aCurrBBCenter) ) { if ( !myBBFirstCheck ) @@ -1479,17 +1617,17 @@ void SVTK_InteractorStyle::DominantCombinedSwitch() */ void SVTK_InteractorStyle::drawRect() { - if ( !myRectBand ) { - myRectBand = new QRubberBand( QRubberBand::Rectangle, GetRenderWidget() ); - QPalette palette; - palette.setColor(myRectBand->foregroundRole(), Qt::white); - myRectBand->setPalette(palette); - } - myRectBand->hide(); + if ( !myRectBand ) + myRectBand = new QtxRectRubberBand( GetRenderWidget() ); + myRectBand->setUpdatesEnabled ( false ); QRect aRect = SUIT_Tools::makeRect(myPoint.x(), myPoint.y(), myOtherPoint.x(), myOtherPoint.y()); - myRectBand->setGeometry( aRect ); - myRectBand->setVisible( aRect.isValid() ); + myRectBand->initGeometry( aRect ); + + if ( !myRectBand->isVisible() ) + myRectBand->show(); + + myRectBand->setUpdatesEnabled ( true ); } /*! @@ -1497,10 +1635,148 @@ void SVTK_InteractorStyle::drawRect() */ void SVTK_InteractorStyle::endDrawRect() { - if ( myRectBand ) myRectBand->hide(); + if ( myRectBand ) { + myRectBand->clearGeometry(); + myRectBand->hide(); + } +} + +bool isIntersect( const QPoint& theStart1, const QPoint& theEnd1, + const QPoint& theStart2, const QPoint& theEnd2 ) +{ + if ( ( theStart1 == theStart2 && theEnd1 == theEnd2 ) || + ( theStart1 == theEnd2 && theEnd1 == theStart2 ) ) + return true; + + if ( theStart1 == theStart2 || theStart2 == theEnd1 || + theStart1 == theEnd2 || theEnd1 == theEnd2 ) + return false; + + double x11 = theStart1.x() * 1.0; + double x12 = theEnd1.x() * 1.0; + double y11 = theStart1.y() * 1.0; + double y12 = theEnd1.y() * 1.0; + + double x21 = theStart2.x() * 1.0; + double x22 = theEnd2.x() * 1.0; + double y21 = theStart2.y() * 1.0; + double y22 = theEnd2.y() * 1.0; + + double k1 = x12 == x11 ? 0 : ( y12 - y11 ) / ( x12 - x11 ); + double k2 = x22 == x21 ? 0 : ( y22 - y21 ) / ( x22 - x21 ); + + double b1 = y11 - k1 * x11; + double b2 = y21 - k2 * x21; + + if ( k1 == k2 ) + { + if ( b1 != b2 ) + return false; + else + return !( ( qMax( x11, x12 ) <= qMin( x21, x22 ) || + qMin( x11, x12 ) >= qMax( x21, x22 ) ) && + ( qMax( y11, y12 ) <= qMin( y21, y22 ) || + qMin( y11, y12 ) >= qMax( y21, y22 ) ) ); + } + else + { + double x0 = ( b2 - b1 ) / ( k1 - k2 ); + double y0 = ( k1 * b2 - k2 * b1 ) / ( k1 - k2 ); + + if ( qMin( x11, x12 ) < x0 && x0 < qMax( x11, x12 ) && + qMin( y11, y12 ) < y0 && y0 < qMax( y11, y12 ) && + qMin( x21, x22 ) < x0 && x0 < qMax( x21, x22 ) && + qMin( y21, y22 ) < y0 && y0 < qMax( y21, y22 ) ) + return true; + } + return false; +} + +bool isValid( const QPolygon* thePoints, const QPoint& theCurrent ) +{ + if ( !thePoints->count() ) + return true; + + if ( thePoints->count() == 1 && thePoints->point( 0 ) == theCurrent ) + return false; + + const QPoint& aLast = thePoints->point( thePoints->count() - 1 ); + + if ( aLast == theCurrent ) + return true; + + bool res = true; + for ( uint i = 0; i < thePoints->count() - 1 && res; i++ ) + { + const QPoint& aStart = thePoints->point( i ); + const QPoint& anEnd = thePoints->point( i + 1 ); + res = !isIntersect( aStart, anEnd, theCurrent, aLast ); + } + return res; +} + +/*! + Draws polygon +*/ +void SVTK_InteractorStyle::drawPolygon() +{ + QSize aToler( 5, 5 ); + if ( !myPolygonBand ) { + myPolygonBand = new QtxPolyRubberBand( GetRenderWidget() ); + QPalette palette; + palette.setColor( myPolygonBand->foregroundRole(), Qt::white ); + myPolygonBand->setPalette( palette ); + myPolygonPoints.append( QPoint( myPoint.x(), myPoint.y() ) ); + } + myPolygonBand->hide(); + + bool closed = false; + bool valid = GetRenderWidget()->rect().contains( QPoint( myOtherPoint.x(), myOtherPoint.y() ) ); + if ( !myPolygonPoints.at(0).isNull() ) + { + QRect aRect( myPolygonPoints.at(0).x() - aToler.width(), myPolygonPoints.at(0).y() - aToler.height(), + 2 * aToler.width(), 2 * aToler.height() ); + closed = aRect.contains( QPoint( myOtherPoint.x(), myOtherPoint.y() ) ); + } + + QPolygon* points = new QPolygon( myPolygonPoints ); + valid = valid && isValid( points, QPoint( myOtherPoint.x(), myOtherPoint.y() ) ); + myPoligonState = valid ? InProcess : NotValid; + delete points; + if ( closed && !valid ) + closed = false; + + if ( closed && myPolygonPoints.size() > 2 ) { + GetRenderWidget()->setCursor( Qt::CrossCursor ); + myPoligonState = Closed; + } + else if ( valid ) + GetRenderWidget()->setCursor( Qt::PointingHandCursor ); + else + GetRenderWidget()->setCursor( Qt::ForbiddenCursor ); + + myPolygonPoints.append( QPoint( myOtherPoint.x(), myOtherPoint.y() ) ); + + QPolygon aPolygon( myPolygonPoints ); + myPolygonBand->initGeometry( aPolygon ); + myPolygonBand->setVisible( true ); + + if ( myPolygonPoints.size() > 1 ) { + myPolygonPoints.remove( myPolygonPoints.size() - 1 ); + } +} + +/*! + \brief Delete rubber band on the end on the dragging operation. +*/ +void SVTK_InteractorStyle::endDrawPolygon() +{ + if ( myPolygonBand ) myPolygonBand->hide(); + + delete myPolygonBand; + myPolygonBand = 0; - delete myRectBand; - myRectBand = 0; + myPolygonPoints.clear(); } /*! @@ -1515,8 +1791,8 @@ void SVTK_InteractorStyle::ProcessEvents( vtkObject* object, vtkObject* anObject = reinterpret_cast( clientData ); SVTK_InteractorStyle* self = dynamic_cast( anObject ); int aSpeedIncrement=self->ControllerIncrement()->Current(); - vtkFloatingPointType aCenter[3]; - vtkFloatingPointType* aSelectedPoint; + double aCenter[3]; + double* aSelectedPoint; if ( self ) { switch ( event ) { case SVTK::SpaceMouseMoveEvent : @@ -1619,7 +1895,7 @@ void SVTK_InteractorStyle::ProcessEvents( vtkObject* object, } self->myPrevRotationPointType = self->myCurrRotationPointType; self->myCurrRotationPointType = SVTK::SetRotateSelected; - aSelectedPoint = (vtkFloatingPointType*)callData; + aSelectedPoint = (double*)callData; self->myRotationPointX = aSelectedPoint[0]; self->myRotationPointY = aSelectedPoint[1]; self->myRotationPointZ = aSelectedPoint[2];