X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROCurveCreator%2FCurveCreator_Widget.cxx;h=16a2da7942c38774237a96e625a9d34a1c47d376;hb=4ddef4dfa7b09c497d8c2bd05557821d5fe5da81;hp=37169ef5ccaac6498621d9cccbb347b2cbe52b7d;hpb=b6e2e1d6c59c665f28b5584d32779c694a7ba233;p=modules%2Fhydro.git diff --git a/src/HYDROCurveCreator/CurveCreator_Widget.cxx b/src/HYDROCurveCreator/CurveCreator_Widget.cxx index 37169ef5..16a2da79 100644 --- a/src/HYDROCurveCreator/CurveCreator_Widget.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Widget.cxx @@ -468,7 +468,7 @@ void CurveCreator_Widget::onAdditionMode(bool checked) return; Handle(AIS_InteractiveContext) aContext = getAISContext(); - if( !myCurve || !aContext ) + if( !myCurve || aContext.IsNull() ) return; mySection= -1; @@ -925,7 +925,7 @@ void CurveCreator_Widget::onGetCoordsByClick( QMouseEvent* pe ) if ( pe->modifiers() != Qt::ControlModifier ) { Handle(AIS_InteractiveContext) ic = getAISContext(); - if ( !ic ) + if ( ic.IsNull() ) return; gp_Pnt aPnt; @@ -1128,26 +1128,18 @@ void CurveCreator_Widget::insertPointToSelectedSegment( const int theX, const int theY ) { Handle(AIS_InteractiveContext) aContext = getAISContext(); - if ( !aContext ) + + OCCViewer_ViewPort3d* aViewPort = getViewPort(); + Handle(V3d_View) aView; + if ( aViewPort ) + aView = aViewPort->getView(); + + if ( aContext.IsNull() || aView.IsNull() ) return; gp_Pnt aPoint; gp_Pnt aPoint1, aPoint2; - bool isFoundPoint = false; - - for ( aContext->InitSelected(); aContext->MoreSelected() && !isFoundPoint; - aContext->NextSelected() ) { - TopoDS_Shape aTShape = aContext->SelectedShape(); - if ( !aTShape.IsNull() && aTShape.ShapeType() == TopAbs_VERTEX ) - continue; - else { - Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner(); - if ( anOwner.IsNull() ) - continue; - const TopLoc_Location& aLocation = anOwner->Location(); - Handle(AIS_InteractiveObject) anAIS = Handle(AIS_InteractiveObject)::DownCast( anOwner->Selectable() ); - isFoundPoint = pointOnObject( anAIS, theX, theY, aPoint, aPoint1, aPoint2 ); - } - } + bool isFoundPoint = CurveCreator_Utils::getNeighbourPoints( aContext, aView, theX, theY, + aPoint, aPoint1, aPoint2 ); if ( !isFoundPoint ) return; @@ -1239,45 +1231,24 @@ void CurveCreator_Widget::updateLocalPointView() if ( myDragStarted ) return; Handle(AIS_InteractiveContext) aContext = getAISContext(); - if ( !aContext ) + if ( aContext.IsNull() ) return; + std::list aSelectedList = CurveCreator_Utils::getSelectedPoints( aContext ); + + std::list::const_iterator anIt = aSelectedList.begin(), aLast = aSelectedList.end(); + float aX, anY, aZ; + bool isBlocked = myLocalPointView->blockSignals(true); - gp_Pnt aPnt; myLocalPointView->setRowCount( 0 ); - for ( aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected() ) { - TopoDS_Vertex aVertex; - TopoDS_Shape aShape = aContext->SelectedShape(); - if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) - aVertex = TopoDS::Vertex( aContext->SelectedShape() ); - else { - Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner(); - if ( !anOwner.IsNull() ) { - Handle(AIS_InteractiveObject) anAIS = Handle(AIS_InteractiveObject)::DownCast( anOwner->Selectable() ); - if ( !anAIS.IsNull() ) { - Handle(AIS_Point) aPoint = Handle(AIS_Point)::DownCast( anAIS); - if ( !aPoint.IsNull() ) - aVertex = TopoDS::Vertex( aPoint->Vertex() ); - } - if ( aVertex.IsNull() ) { - // the following happens if there are no points in the current curve, there is only a shape - /*Handle(StdSelect_BRepOwner) aBrepOwner = Handle(StdSelect_BRepOwner)::DownCast(anOwner); - if ( aBrepOwner.IsNull() ) - continue; - if ( aBrepOwner->HasShape() ) { - const TopoDS_Shape& aShape = aBrepOwner->Shape(); - if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) - { - aVertex = TopoDS::Vertex( aShape ); - } - }*/ - } - } - } - if ( aVertex.IsNull() ) - continue; - aPnt = BRep_Tool::Pnt( aVertex ); - addLocalPointToTable( aPnt.X(), aPnt.Y() ); + for ( ; anIt != aLast; anIt++ ) + { + aX = *anIt; + anIt++; + anY = *anIt; + anIt++; + aZ = *anIt; + addLocalPointToTable( aX, anY ); } myLocalPointView->blockSignals(isBlocked); } @@ -1287,48 +1258,9 @@ void CurveCreator_Widget::updateLocalPointView() */ void CurveCreator_Widget::setLocalPointContext( const bool theOpen, const bool isUpdateTable ) { - Handle(AIS_InteractiveContext) ic = getAISContext(); - if ( !ic ) - return; - - if ( theOpen ) { - // Open local context if there is no one - if ( !ic->HasOpenedContext() ) { - ic->ClearCurrents( false ); - ic->OpenLocalContext( false/*use displayed objects*/, true/*allow shape decomposition*/ ); - } - AIS_ListOfInteractive aList; - ic->DisplayedObjects( aList ); - int aLSize = 0; - for ( AIS_ListIteratorOfListOfInteractive it( aList ); it.More(); it.Next() ) - aLSize++; - - for ( AIS_ListIteratorOfListOfInteractive it( aList ); it.More(); it.Next() ) - { - Handle(AIS_InteractiveObject) anAIS = it.Value(); - if ( !anAIS.IsNull() ) - { - if ( anAIS->IsKind( STANDARD_TYPE( AIS_Shape ) ) ) - { - ic->Load( anAIS, -1/*selection mode*/, true/*allow decomposition*/ ); - ic->Activate( anAIS, AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)TopAbs_WIRE ) ); - //ic->Activate( anAIS, AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)TopAbs_VERTEX ) ); - } - else if ( anAIS->DynamicType() != STANDARD_TYPE(AIS_Trihedron) ) - { - ic->Load( anAIS, -1/*selection mode*/, false/*allow decomposition*/ ); - ic->Activate( anAIS, TopAbs_VERTEX ); - } - } - continue; - } - } - else { - if ( ic->HasOpenedContext() ) - ic->CloseAllContexts(); - if ( isUpdateTable ) - updateLocalPointView(); - } + CurveCreator_Utils::setLocalPointContext( getAISContext(), theOpen ); + if ( !theOpen && isUpdateTable ) + updateLocalPointView(); } void CurveCreator_Widget::addLocalPointToTable( const double theX, const double theY ) @@ -1423,7 +1355,7 @@ void CurveCreator_Widget::setSelectedPonts( const CurveCreator_Widget::SectionTo if ( myDragStarted ) return; Handle(AIS_InteractiveContext) ic = getAISContext(); - if ( !ic || !ic->HasOpenedContext() ) + if ( ic.IsNull() || !ic->HasOpenedContext() ) return; AIS_ListOfInteractive aListToSelect; @@ -1562,126 +1494,6 @@ void CurveCreator_Widget::convert( const SectionToPointList& thePoints, } } -/** - * Checks whether the point belongs to the OCC object - * \param theObject a line or shape with a bspline inside - * \param theX the X coordinate in the view. - * \param theY the Y coordinate in the view. - * \param thePoint the output point to be append to the model curve - * \param thePoint1 the output point to bound the line where a new point should be inserted - * \param thePoint2 the output point to bound the line where a new point should be inserted - */ -bool CurveCreator_Widget::pointOnObject( Handle(AIS_InteractiveObject) theObject, - const int theX, const int theY, - gp_Pnt& thePoint, - gp_Pnt& thePoint1, gp_Pnt& thePoint2 ) -{ - bool isFound = false; - - Handle(AIS_InteractiveContext) aContext = getAISContext(); - if ( theObject.IsNull() || !aContext ) - return isFound; - - gp_Pnt aPoint; - Standard_Real aParameter; - gp_Pnt aPnt1, aPnt2; - Handle(AIS_Line) aLine = Handle(AIS_Line)::DownCast( theObject ); - if ( !aLine.IsNull() ) { - const Handle(Geom_Line) aGLine = aLine->Line(); - isFound = hasProjectPointOnCurve( theX, theY, aGLine, aParameter ); - if ( isFound ) { - aPoint = aGLine->Value( aParameter ); - - Handle(Geom_Point) aPStart; - Handle(Geom_Point) aPEnd; - aLine->Points( aPStart, aPEnd ); - aPnt1 = aPStart->Pnt(); - aPnt2 = aPEnd->Pnt(); - - // in case of Geom line a projection is performed to the infinite line, - // so it is necessary to bound it by the line size - Bnd_Box aLineBox; - aLineBox.Set( aPnt1, gp_Vec( aPnt1, aPnt2 ) ); - isFound = !aLineBox.IsOut( aPoint ); - } - } - else { - Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast( theObject ); - if ( !aShape.IsNull() ) { - const TopoDS_Wire& aWire = TopoDS::Wire( aShape->Shape() ); - if ( !aWire.IsNull() ) { - TopExp_Explorer anExp( aWire, TopAbs_EDGE ); - for ( ; anExp.More(); anExp.Next()) - { - const TopoDS_Edge& anEdge = TopoDS::Edge(anExp.Current()); - if ( !anEdge.IsNull() ) { - Standard_Real aFirst, aLast; - Handle(Geom_Curve) aCurve = BRep_Tool::Curve( anEdge, aFirst, aLast ); - - if ( aCurve->IsKind( STANDARD_TYPE(Geom_BSplineCurve) ) ) { - Handle(Geom_BSplineCurve) aBSplineCurve = Handle(Geom_BSplineCurve)::DownCast( aCurve ); - if ( !aBSplineCurve.IsNull() ) { - isFound = hasProjectPointOnCurve( theX, theY, aCurve, aParameter ); - if ( isFound ) { - aPoint = aBSplineCurve->Value( aParameter ); - Standard_Integer anI1, anI2; - aBSplineCurve->LocateU( aParameter, LOCAL_SELECTION_TOLERANCE, anI1, anI2 ); - - aPnt1 = aBSplineCurve->Value( aBSplineCurve->Knot( anI1 ) ); - aPnt2 = aBSplineCurve->Value( aBSplineCurve->Knot( anI2 ) ); - } - } - } - } - } - } - } - } - if ( isFound ) { - thePoint = aPoint; - thePoint1 = aPnt1; - thePoint2 = aPnt2; - } - return isFound; -} - -/** - * Returns whether the clicked point belong to the curve or has a very near projection - * \param theX the X coordinate of a point clicked in the OCC viewer - * \param theY the Y coordinate of a point clicked in the OCC viewer - * \param theCurve a geometry curve - * \param theOutPoint a found projected point on the curve - */ -bool CurveCreator_Widget::hasProjectPointOnCurve( const int theX, const int theY, - const Handle(Geom_Curve)& theCurve, - Standard_Real& theParameter ) -{ - bool isFound = false; - OCCViewer_ViewPort3d* aViewPort = getViewPort(); - if ( !aViewPort ) - return isFound; - - Handle(V3d_View) aView = aViewPort->getView(); - gp_Pnt aPoint = CurveCreator_Utils::ConvertClickToPoint( theX, theY, aView ); - - GeomAPI_ProjectPointOnCurve aProj( aPoint, theCurve ); - Standard_Integer aNbPoint = aProj.NbPoints(); - if (aNbPoint > 0) { - for (Standard_Integer j = 1; j <= aNbPoint && !isFound; j++) { - gp_Pnt aNewPoint = aProj.Point( j ); - theParameter = aProj.Parameter( j ); - - int aX, anY; - CurveCreator_Utils::ConvertPointToClick( aNewPoint, aView, aX, anY ); - - int aXDelta = abs( aX - theX ); - int anYDelta = abs( anY - theY ); - isFound = aXDelta < SCENE_PIXEL_TOLERANCE && anYDelta < SCENE_PIXEL_TOLERANCE; - } - } - return isFound; -} - /** * Returns a section index from the table * \param theRowId a table row