- int aDelta, aMinDelta = 2*SCENE_PIXEL_TOLERANCE*SCENE_PIXEL_TOLERANCE;
- Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast( theObject );
- if ( !aShape.IsNull() ) {
- const TopoDS_Compound& aCompound = TopoDS::Compound( aShape->Shape() );
- if ( !aCompound.IsNull() ) {
- TopExp_Explorer anExp( aCompound, TopAbs_EDGE );
- for ( ; anExp.More(); anExp.Next())
- {
- const TopoDS_Edge& anEdge = TopoDS::Edge(anExp.Current());
- if ( anEdge.IsNull() )
- continue;
- 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( theView, theX, theY, aBSplineCurve,
- aParameter, aDelta );
- 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 ) );
- }
- }
- }
- else { // usual curve
- Handle(Geom_Line) aGLine = Handle(Geom_Line)::DownCast( aCurve );
- if ( !aGLine.IsNull() ) {
- isFound = hasProjectPointOnCurve( theView, theX, theY, aGLine, aParameter,
- aDelta );
- if ( isFound ) {
- aPoint = aGLine->Value( aParameter );
-
- TopoDS_Vertex V1, V2;
- TopExp::Vertices(anEdge, V1, V2, Standard_True);
- if (!V1.IsNull() && !V2.IsNull())
- {
- aPnt1 = BRep_Tool::Pnt(V1);
- aPnt2 = BRep_Tool::Pnt(V2);
- }
- gp_Vec aVec1( aPnt1, aPoint );
- gp_Vec aVec2( aPnt2, aPoint );
- double anAngle = aVec1.Angle( aVec2 );
- isFound = fabs( anAngle - M_PI ) < LOCAL_SELECTION_TOLERANCE;
- }
- }
- }
- if ( isFound && aMinDelta >= aDelta ) {
- isFullFound = true;
- aMinDelta = aDelta;
- aFoundPnt1 = aPnt1;
- aFoundPnt2 = aPnt2;
- aFoundPoint = aPoint;
- }
+ const TopoDS_Edge& anEdge = TopoDS::Edge(anExp.Current());
+ if ( anEdge.IsNull() )
+ continue;
+ 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( theView, theX, theY, aBSplineCurve,
+ aParameter, aDelta );
+ if ( isFound ) {
+ aCurPoint = aBSplineCurve->Value( aParameter );
+ Standard_Integer anI1, anI2;
+ aBSplineCurve->LocateU( aParameter, LOCAL_SELECTION_TOLERANCE, anI1, anI2 );
+ aCurPoint1 = aBSplineCurve->Value( aBSplineCurve->Knot( anI1 ) );
+ aCurPoint2 = aBSplineCurve->Value( aBSplineCurve->Knot( anI2 ) );