- bool isFound = false;
-
- OCCViewer_Viewer* aViewer = getOCCViewer();
- if ( theObject.IsNull() || !aViewer )
- 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;
- //thePoint1 = findLocalPointIndex( 0, aPnt1.X(), aPnt1.Y() );
- //thePoint2 = findLocalPointIndex( 0, aPnt2.X(), aPnt2.Y() );
- //isFound = thePoint1 >= 0 && thePoint2 >= 0;
- }
- 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_Viewer* aViewer = getOCCViewer();
- if ( !aViewer )
- return isFound;
-
- OCCViewer_ViewWindow* aWindow =
- (OCCViewer_ViewWindow*)aViewer->getViewManager()->getActiveView();
- Handle(V3d_View) aView = aWindow->getViewPort()->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;