1 // Copyright: Matra-Datavision 1995
2 // File: StdSelect_BRepSelectionTool.cxx
3 // Created: Tue Mar 14 14:09:28 1995
4 // Author: Robert COUBLANC
7 #include <StdSelect_BRepSelectionTool.ixx>
8 #include <GeomAdaptor_Curve.hxx>
9 #include <BRepAdaptor_Curve.hxx>
10 #include <TopTools_IndexedMapOfShape.hxx>
12 #include <TopExp_Explorer.hxx>
13 #include <BRepTools_WireExplorer.hxx>
14 #include <Select3D_SensitivePoint.hxx>
15 #include <StdSelect_BRepOwner.hxx>
17 #include <BRepAdaptor_Curve.hxx>
18 #include <BRepAdaptor_Surface.hxx>
19 #include <GeomAbs_SurfaceType.hxx>
20 #include <BRepBndLib.hxx>
21 #include <Bnd_Box.hxx>
22 #include <BRep_Tool.hxx>
23 #include <Geom_Circle.hxx>
24 #include <Select3D_SensitiveCircle.hxx>
25 #include <Select3D_SensitiveCurve.hxx>
26 #include <Select3D_SensitiveSegment.hxx>
27 #include <Select3D_SensitiveWire.hxx>
28 #include <Select3D_SensitiveFace.hxx>
29 #include <Select3D_SensitiveBox.hxx>
30 #include <Select3D_SensitiveTriangulation.hxx>
31 #include <Select3D_SensitiveTriangle.hxx>
32 #include <Select3D_SensitiveGroup.hxx>
34 #include <Select3D_ListIteratorOfListOfSensitive.hxx>
35 #include <Select3D_ListOfSensitiveTriangle.hxx>
36 #include <TColgp_HArray1OfPnt.hxx>
37 #include <TColgp_SequenceOfPnt.hxx>
38 #include <TColStd_Array1OfReal.hxx>
39 #include <BRep_Tool.hxx>
40 #include <BRepTools.hxx>
41 #include <Select3D_TypeOfSensitivity.hxx>
42 #include <Precision.hxx>
43 #include <gp_Circ.hxx>
44 #include <GCPnts_TangentialDeflection.hxx>
45 #include <TopoDS_Wire.hxx>
46 #include <Poly_Array1OfTriangle.hxx>
47 #include <Poly_Polygon3D.hxx>
48 #include <Poly_PolygonOnTriangulation.hxx>
49 #include <Poly_Triangulation.hxx>
50 #include <BRepMesh_IncrementalMesh.hxx>
51 #include <Standard_NullObject.hxx>
52 #include <Standard_ErrorHandler.hxx>
54 //==================================================
57 //==================================================
58 void StdSelect_BRepSelectionTool
59 ::Load (const Handle(SelectMgr_Selection)& theSelection,
60 const TopoDS_Shape& theShape,
61 const TopAbs_ShapeEnum theType,
62 const Standard_Real theDeflection,
63 const Standard_Real theDeviationAngle,
64 const Standard_Boolean isAutoTriangulation,
65 const Standard_Integer thePriority,
66 const Standard_Integer theNbPOnEdge,
67 const Standard_Real theMaxParam)
69 Standard_Integer aPriority = (thePriority == -1) ? GetStandardPriority (theShape, theType) : thePriority;
71 if( isAutoTriangulation && !BRepTools::Triangulation (theShape, Precision::Infinite()) )
73 BRepMesh_IncrementalMesh(theShape, theDeflection, Standard_False, theDeviationAngle);
76 Handle(StdSelect_BRepOwner) aBrepOwner;
85 case TopAbs_COMPSOLID:
87 TopTools_IndexedMapOfShape aSubShapes;
88 TopExp::MapShapes (theShape, theType, aSubShapes);
90 Standard_Boolean isComesFromDecomposition = !((aSubShapes.Extent() == 1) && (theShape == aSubShapes (1)));
91 for (Standard_Integer aShIndex = 1; aShIndex <= aSubShapes.Extent(); ++aShIndex)
93 const TopoDS_Shape& aSubShape = aSubShapes (aShIndex);
94 aBrepOwner = new StdSelect_BRepOwner (aSubShape, aPriority, isComesFromDecomposition);
95 ComputeSensitive (aSubShape, aBrepOwner,
101 isAutoTriangulation);
107 aBrepOwner = new StdSelect_BRepOwner (theShape, aPriority);
108 ComputeSensitive (theShape, aBrepOwner,
114 isAutoTriangulation);
119 //==================================================
122 //==================================================
123 void StdSelect_BRepSelectionTool
124 ::Load (const Handle(SelectMgr_Selection)& theSelection,
125 const Handle(SelectMgr_SelectableObject)& theSelectableObj,
126 const TopoDS_Shape& theShape,
127 const TopAbs_ShapeEnum theType,
128 const Standard_Real theDeflection,
129 const Standard_Real theDeviationAngle,
130 const Standard_Boolean isAutoTriangulation,
131 const Standard_Integer thePriority,
132 const Standard_Integer theNbPOnEdge,
133 const Standard_Real theMaxParam)
145 // loading of selectables...
146 for (theSelection->Init(); theSelection->More(); theSelection->Next())
148 Handle(SelectMgr_EntityOwner) anOwner
149 = Handle(SelectMgr_EntityOwner)::DownCast (theSelection->Sensitive()->OwnerId());
150 anOwner->Set (theSelectableObj);
154 //==================================================
155 // Function: ComputeSensitive
157 //==================================================
158 void StdSelect_BRepSelectionTool
159 ::ComputeSensitive (const TopoDS_Shape& theShape,
160 const Handle(StdSelect_BRepOwner)& theOwner,
161 const Handle(SelectMgr_Selection)& theSelection,
162 const Standard_Real theDeflection,
163 const Standard_Real theDeviationAngle,
164 const Standard_Integer theNbPOnEdge,
165 const Standard_Real theMaxParam,
166 const Standard_Boolean isAutoTriangulation)
168 switch (theShape.ShapeType())
172 theSelection->Add (new Select3D_SensitivePoint
173 (theOwner, BRep_Tool::Pnt (TopoDS::Vertex (theShape))));
178 Handle(Select3D_SensitiveEntity) aSensitive;
179 GetEdgeSensitive (theShape, theOwner, theSelection,
180 theDeflection, theDeviationAngle, theNbPOnEdge, theMaxParam,
182 if (!aSensitive.IsNull())
184 theSelection->Add (aSensitive);
190 BRepTools_WireExplorer aWireExp (TopoDS::Wire (theShape));
191 Handle (Select3D_SensitiveEntity) aSensitive;
192 Handle (Select3D_SensitiveWire) aWireSensitive = new Select3D_SensitiveWire (theOwner);
193 theSelection->Add (aWireSensitive);
194 while (aWireExp.More())
196 GetEdgeSensitive (aWireExp.Current(), theOwner, theSelection,
197 theDeflection, theDeviationAngle, theNbPOnEdge, theMaxParam,
199 if (!aSensitive.IsNull())
201 aWireSensitive->Add (aSensitive);
209 const TopoDS_Face& aFace = TopoDS::Face (theShape);
210 Select3D_ListOfSensitive aSensitiveList;
211 GetSensitiveForFace (aFace, theOwner,
213 isAutoTriangulation, theNbPOnEdge, theMaxParam);
214 for (Select3D_ListIteratorOfListOfSensitive aSensIter (aSensitiveList);
215 aSensIter.More(); aSensIter.Next())
217 theSelection->Add (aSensIter.Value());
223 case TopAbs_COMPSOLID:
225 TopTools_IndexedMapOfShape aSubfacesMap;
226 TopExp::MapShapes (theShape, TopAbs_FACE, aSubfacesMap);
227 for (Standard_Integer aShIndex = 1; aShIndex <= aSubfacesMap.Extent(); ++aShIndex)
229 ComputeSensitive (aSubfacesMap (aShIndex), theOwner,
231 theDeflection, theDeviationAngle, theNbPOnEdge, theMaxParam, isAutoTriangulation);
235 case TopAbs_COMPOUND:
238 TopExp_Explorer anExp;
240 for (anExp.Init (theShape, TopAbs_VERTEX, TopAbs_EDGE); anExp.More(); anExp.Next())
242 ComputeSensitive (anExp.Current(), theOwner,
244 theDeflection, theDeviationAngle, theNbPOnEdge, theMaxParam, isAutoTriangulation);
247 for (anExp.Init (theShape, TopAbs_EDGE, TopAbs_FACE); anExp.More(); anExp.Next())
249 ComputeSensitive (anExp.Current(), theOwner,
251 theDeflection, theDeviationAngle, theNbPOnEdge, theMaxParam, isAutoTriangulation);
254 for (anExp.Init (theShape, TopAbs_WIRE, TopAbs_FACE); anExp.More(); anExp.Next())
256 ComputeSensitive (anExp.Current(), theOwner,
258 theDeflection, theDeviationAngle, theNbPOnEdge, theMaxParam, isAutoTriangulation);
262 TopTools_IndexedMapOfShape aSubfacesMap;
263 TopExp::MapShapes (theShape, TopAbs_FACE, aSubfacesMap);
264 for (Standard_Integer aShIndex = 1; aShIndex <= aSubfacesMap.Extent(); ++aShIndex)
266 ComputeSensitive (aSubfacesMap (aShIndex), theOwner,
268 theDeflection, theDeviationAngle, theNbPOnEdge, theMaxParam, isAutoTriangulation);
274 //==================================================
275 // Function: GetPointsFromPolygon
277 //==================================================
278 static Handle(TColgp_HArray1OfPnt) GetPointsFromPolygon (const TopoDS_Edge& theEdge,
279 const Standard_Real theDeflection)
281 Handle(TColgp_HArray1OfPnt) aResultPoints;
283 Standard_Real fi, la;
284 Handle(Geom_Curve) CC3d = BRep_Tool::Curve (theEdge, fi, la);
286 TopLoc_Location aLocation;
287 Handle(Poly_Polygon3D) aPolygon = BRep_Tool::Polygon3D (theEdge, aLocation);
288 if (!aPolygon.IsNull())
290 Standard_Boolean isOK = aPolygon->Deflection() <= theDeflection;
291 isOK = isOK || (CC3d.IsNull());
294 const TColgp_Array1OfPnt& aNodes = aPolygon->Nodes();
295 aResultPoints = new TColgp_HArray1OfPnt (1, aNodes.Length());
296 if (aLocation.IsIdentity())
298 for (Standard_Integer aNodeId (aNodes.Lower()), aPntId (1); aNodeId <= aNodes.Upper(); ++aNodeId, ++aPntId)
300 aResultPoints->SetValue (aPntId, aNodes.Value (aNodeId));
305 for (Standard_Integer aNodeId (aNodes.Lower()), aPntId (1); aNodeId <= aNodes.Upper(); ++aNodeId, ++aPntId)
307 aResultPoints->SetValue (aPntId, aNodes.Value (aNodeId).Transformed (aLocation));
310 return aResultPoints;
314 Handle(Poly_Triangulation) aTriangulation;
315 Handle(Poly_PolygonOnTriangulation) anHIndices;
316 BRep_Tool::PolygonOnTriangulation (theEdge, anHIndices, aTriangulation, aLocation);
317 if (!anHIndices.IsNull())
319 Standard_Boolean isOK = anHIndices->Deflection() <= theDeflection;
320 isOK = isOK || (CC3d.IsNull());
323 const TColStd_Array1OfInteger& anIndices = anHIndices->Nodes();
324 const TColgp_Array1OfPnt& aNodes = aTriangulation->Nodes();
326 aResultPoints = new TColgp_HArray1OfPnt (1, anIndices.Length());
328 if (aLocation.IsIdentity())
330 for (Standard_Integer anIndex (anIndices.Lower()), aPntId (1); anIndex <= anIndices.Upper(); ++anIndex, ++aPntId)
332 aResultPoints->SetValue (aPntId, aNodes (anIndices (anIndex)));
337 for (Standard_Integer anIndex (anIndices.Lower()), aPntId (1); anIndex <= anIndices.Upper(); ++anIndex, ++aPntId)
339 aResultPoints->SetValue (aPntId, aNodes (anIndices (anIndex)).Transformed (aLocation));
342 return aResultPoints;
345 return aResultPoints;
348 //==================================================
349 // Function: FindLimits
351 //==================================================
352 static Standard_Boolean FindLimits (const Adaptor3d_Curve& theCurve,
353 const Standard_Real theLimit,
354 Standard_Real& theFirst,
355 Standard_Real& theLast)
357 theFirst = theCurve.FirstParameter();
358 theLast = theCurve.LastParameter();
359 Standard_Boolean isFirstInf = Precision::IsNegativeInfinite (theFirst);
360 Standard_Boolean isLastInf = Precision::IsPositiveInfinite (theLast);
361 if (isFirstInf || isLastInf)
364 Standard_Real aDelta = 1.0;
365 Standard_Integer anIterCount = 0;
366 if (isFirstInf && isLastInf)
369 if (anIterCount++ >= 100000) return Standard_False;
373 theCurve.D0 (theFirst, aPnt1);
374 theCurve.D0 (theLast, aPnt2);
375 } while (aPnt1.Distance (aPnt2) < theLimit);
379 theCurve.D0 (theLast, aPnt2);
381 if (anIterCount++ >= 100000) return Standard_False;
383 theFirst = theLast - aDelta;
384 theCurve.D0 (theFirst, aPnt1);
385 } while (aPnt1.Distance (aPnt2) < theLimit);
389 theCurve.D0 (theFirst, aPnt1);
391 if (anIterCount++ >= 100000) return Standard_False;
393 theLast = theFirst + aDelta;
394 theCurve.D0 (theLast, aPnt2);
395 } while (aPnt1.Distance (aPnt2) < theLimit);
398 return Standard_True;
401 //=====================================================
402 // Function : GetEdgeSensitive
403 // Purpose : create a sensitive edge to add it
404 // in computeselection to "aselection" (case of selection of an edge)
405 // or to "aSensitiveWire" (case of selection of a wire; in this case,
406 // the sensitive wire is added to "aselection" )
407 // odl - for selection by rectangle -
408 //=====================================================
409 void StdSelect_BRepSelectionTool
410 ::GetEdgeSensitive (const TopoDS_Shape& theShape,
411 const Handle(StdSelect_BRepOwner)& theOwner,
412 const Handle(SelectMgr_Selection)& theSelection,
413 const Standard_Real theDeflection,
414 const Standard_Real theDeviationAngle,
415 const Standard_Integer theNbPOnEdge,
416 const Standard_Real theMaxParam,
417 Handle(Select3D_SensitiveEntity)& theSensitive)
419 const TopoDS_Edge& anEdge = TopoDS::Edge (theShape);
420 BRepAdaptor_Curve cu3d;
423 cu3d.Initialize (anEdge);
424 } catch (Standard_NullObject) {
428 // try to get points from existing polygons
429 Handle(TColgp_HArray1OfPnt) aPoints = GetPointsFromPolygon (anEdge, theDeflection);
430 if (!aPoints.IsNull() && aPoints->Length() > 0)
432 theSensitive = new Select3D_SensitiveCurve (theOwner, aPoints);
436 Standard_Real aParamFirst = cu3d.FirstParameter();
437 Standard_Real aParamLast = cu3d.LastParameter();
438 switch (cu3d.GetType())
442 BRep_Tool::Range (anEdge, aParamFirst, aParamLast);
443 theSensitive = new Select3D_SensitiveSegment (theOwner,
444 cu3d.Value (aParamFirst),
445 cu3d.Value (aParamLast));
450 Handle (Geom_Circle) aCircle = new Geom_Circle (cu3d.Circle());
451 if (aCircle->Radius() <= Precision::Confusion())
453 theSelection->Add (new Select3D_SensitivePoint (theOwner, aCircle->Location()));
457 theSensitive = new Select3D_SensitiveCircle (theOwner, aCircle,
458 aParamFirst, aParamLast, Standard_False, 16);
464 // reproduce drawing behaviour
465 // TODO: remove copy-paste from StdPrs_Curve and some others...
466 if (FindLimits (cu3d, theMaxParam, aParamFirst, aParamLast))
468 Standard_Integer aNbIntervals = cu3d.NbIntervals (GeomAbs_C1);
469 TColStd_Array1OfReal anIntervals (1, aNbIntervals + 1);
470 cu3d.Intervals (anIntervals, GeomAbs_C1);
471 Standard_Real aV1, aV2;
472 Standard_Integer aNumberOfPoints;
473 TColgp_SequenceOfPnt aPointsSeq;
474 for (Standard_Integer anIntervalId = 1; anIntervalId <= aNbIntervals; ++anIntervalId)
476 aV1 = anIntervals (anIntervalId);
477 aV2 = anIntervals (anIntervalId + 1);
478 if (aV2 > aParamFirst && aV1 < aParamLast)
480 aV1 = Max (aV1, aParamFirst);
481 aV2 = Min (aV2, aParamLast);
483 GCPnts_TangentialDeflection anAlgo (cu3d, aV1, aV2, theDeviationAngle, theDeflection);
484 aNumberOfPoints = anAlgo.NbPoints();
486 for (Standard_Integer aPntId = 1; aPntId < aNumberOfPoints; ++aPntId)
488 aPointsSeq.Append (anAlgo.Value (aPntId));
490 if (aNumberOfPoints > 0 && anIntervalId == aNbIntervals)
492 aPointsSeq.Append (anAlgo.Value (aNumberOfPoints));
497 aPoints = new TColgp_HArray1OfPnt (1, aPointsSeq.Length());
498 for (Standard_Integer aPntId = 1; aPntId <= aPointsSeq.Length(); ++aPntId)
500 aPoints->SetValue (aPntId, aPointsSeq.Value (aPntId));
502 theSensitive = new Select3D_SensitiveCurve (theOwner, aPoints);
506 // simple subdivisions
507 Standard_Integer nbintervals = 1;
508 if (cu3d.GetType() == GeomAbs_BSplineCurve)
510 nbintervals = cu3d.NbKnots() - 1;
511 nbintervals = Max (1, nbintervals / 3);
514 Standard_Real aParam;
515 Standard_Integer aPntNb = Max (2, theNbPOnEdge * nbintervals);
516 Standard_Real aParamDelta = (aParamLast - aParamFirst) / (aPntNb - 1);
517 Handle(TColgp_HArray1OfPnt) aPointArray = new TColgp_HArray1OfPnt (1, aPntNb);
518 for (Standard_Integer aPntId = 1; aPntId <= aPntNb; ++aPntId)
520 aParam = aParamFirst + aParamDelta * (aPntId - 1);
521 aPointArray->SetValue (aPntId, cu3d.Value (aParam));
523 theSensitive = new Select3D_SensitiveCurve (theOwner, aPointArray);
529 //=====================================================
530 // Function : GetStandardPriority
532 //=====================================================
533 Standard_Integer StdSelect_BRepSelectionTool::GetStandardPriority (const TopoDS_Shape& theShape,
534 const TopAbs_ShapeEnum theType)
538 case TopAbs_VERTEX: return 8;
539 case TopAbs_EDGE: return 7;
540 case TopAbs_WIRE: return 6;
541 case TopAbs_FACE: return 5;
544 switch (theShape.ShapeType())
546 case TopAbs_VERTEX: return 9;
547 case TopAbs_EDGE: return 8;
548 case TopAbs_WIRE: return 7;
549 case TopAbs_FACE: return 6;
550 case TopAbs_SHELL: return 5;
551 case TopAbs_COMPOUND:
552 case TopAbs_COMPSOLID:
561 //=======================================================================
562 //function : GetSensitiveEntityForFace
564 //=======================================================================
565 Standard_Boolean StdSelect_BRepSelectionTool
566 ::GetSensitiveForFace (const TopoDS_Face& theFace,
567 const Handle(StdSelect_BRepOwner)& theOwner,
568 Select3D_ListOfSensitive& theSensitiveList,
569 const Standard_Boolean theAutoTriangulation,
570 const Standard_Integer NbPOnEdge,
571 const Standard_Real theMaxParam,
572 const Standard_Boolean theInteriorFlag)
574 // check if there is triangulation of the face...
575 TopLoc_Location aLoc;
576 Handle(Poly_Triangulation) aTriangulation = BRep_Tool::Triangulation (theFace, aLoc);
578 if (!aTriangulation.IsNull())
580 Handle(Select3D_SensitiveTriangulation) STG = new Select3D_SensitiveTriangulation (theOwner, aTriangulation, aLoc, theInteriorFlag);
581 theSensitiveList.Append (STG);
582 return Standard_True;
585 // for faces with triangulation bugs or without autotriangulation ....
586 // very ugly and should not even exist ...
587 BRepAdaptor_Surface BS;
588 BS.Initialize (theFace);
590 Standard_Real FirstU = BS.FirstUParameter() <= -Precision::Infinite() ? -theMaxParam : BS.FirstUParameter();
591 Standard_Real LastU = BS.LastUParameter() >= Precision::Infinite() ? theMaxParam : BS.LastUParameter();
592 Standard_Real FirstV = BS.FirstVParameter() <= -Precision::Infinite() ? -theMaxParam : BS.FirstVParameter();
593 Standard_Real LastV = BS.LastVParameter() >= Precision::Infinite() ? theMaxParam : BS.LastVParameter();
595 if (BS.GetType() == GeomAbs_Plane)
598 Handle(TColgp_HArray1OfPnt) P = new TColgp_HArray1OfPnt (1, 5);
599 BS.D0 (FirstU, FirstV, pcur);
600 P->SetValue (1, pcur);
601 BS.D0 (LastU, FirstV, pcur);
602 P->SetValue (2, pcur);
603 BS.D0 (LastU, LastV, pcur);
604 P->SetValue (3, pcur);
605 BS.D0 (FirstU, LastV, pcur);
606 P->SetValue (4, pcur);
607 P->SetValue (5, P->Value (1));
608 // if the plane is "infinite", it is sensitive only on the border limited by MaxParam
609 if (FirstU == -theMaxParam && LastU == theMaxParam && FirstV == -theMaxParam && LastV == theMaxParam)
611 theSensitiveList.Append (new Select3D_SensitiveFace (theOwner, P, Select3D_TOS_BOUNDARY));
615 Select3D_TypeOfSensitivity TS = theInteriorFlag ? Select3D_TOS_INTERIOR : Select3D_TOS_BOUNDARY;
616 theSensitiveList.Append (new Select3D_SensitiveFace (theOwner, P, TS));
618 return Standard_True;
621 // This is construction of a sevsitive polygon from the exterior contour of the face...
622 // It is not good at all, but...
624 TopExp_Explorer anExpWiresInFace (theFace, TopAbs_WIRE);
625 if (anExpWiresInFace.More())
627 // believing that this is the first... to be seen
628 aWire = TopoDS::Wire (anExpWiresInFace.Current());
632 return Standard_False;
635 TColgp_SequenceOfPnt WirePoints;
636 Standard_Boolean FirstExp = Standard_True;
637 Standard_Real wf, wl;
638 BRepAdaptor_Curve cu3d;
639 for (BRepTools_WireExplorer aWireExplorer (aWire);
640 aWireExplorer.More(); aWireExplorer.Next())
642 cu3d.Initialize (aWireExplorer.Current());
643 BRep_Tool::Range (aWireExplorer.Current(), wf, wl);
644 if (Abs (wf - wl) <= Precision::Confusion())
647 cout<<" StdSelect_BRepSelectionTool : Curve where ufirst = ulast ...."<<endl;
654 if (aWireExplorer.Orientation() == TopAbs_FORWARD)
656 WirePoints.Append (cu3d.Value (wf));
660 WirePoints.Append (cu3d.Value (wl));
662 FirstExp = Standard_False;
665 switch (cu3d.GetType())
669 WirePoints.Append (cu3d.Value ((aWireExplorer.Orientation() == TopAbs_FORWARD) ? wl : wf));
674 if (2 * M_PI - Abs (wl - wf) <= Precision::Confusion())
676 if (BS.GetType() == GeomAbs_Cylinder ||
677 BS.GetType() == GeomAbs_Torus ||
678 BS.GetType() == GeomAbs_Cone ||
679 BS.GetType() == GeomAbs_BSplineSurface) // beuurkk pour l'instant...
681 Standard_Real ff = wf ,ll = wl;
682 Standard_Real dw =(Max (wf, wl) - Min (wf, wl)) / (Standard_Real )Max (2, NbPOnEdge - 1);
683 if (aWireExplorer.Orientation() == TopAbs_FORWARD)
685 for (Standard_Real wc = wf + dw; wc <= wl; wc += dw)
687 WirePoints.Append (cu3d.Value (wc));
690 else if (aWireExplorer.Orientation() == TopAbs_REVERSED)
692 for (Standard_Real wc = ll - dw; wc >= ff; wc -= dw)
694 WirePoints.Append (cu3d.Value (wc));
700 if (cu3d.Circle().Radius() <= Precision::Confusion())
702 theSensitiveList.Append (new Select3D_SensitivePoint (theOwner, cu3d.Circle().Location()));
706 theSensitiveList.Append (new Select3D_SensitiveCircle (theOwner, new Geom_Circle (cu3d.Circle()), theInteriorFlag, 16));
712 Standard_Real ff = wf, ll = wl;
713 Standard_Real dw = (Max (wf, wl) - Min (wf, wl)) / (Standard_Real )Max (2, NbPOnEdge - 1);
714 if (aWireExplorer.Orientation() == TopAbs_FORWARD)
716 for (Standard_Real wc = wf + dw; wc <= wl; wc += dw)
718 WirePoints.Append (cu3d.Value (wc));
721 else if (aWireExplorer.Orientation() == TopAbs_REVERSED)
723 for (Standard_Real wc = ll - dw; wc >= ff; wc -= dw)
725 WirePoints.Append (cu3d.Value (wc));
733 Standard_Real ff = wf, ll = wl;
734 Standard_Real dw = (Max (wf, wl) - Min (wf, wl)) / (Standard_Real )Max (2, NbPOnEdge - 1);
735 if (aWireExplorer.Orientation()==TopAbs_FORWARD)
737 for (Standard_Real wc = wf + dw; wc <= wl; wc += dw)
739 WirePoints.Append (cu3d.Value (wc));
742 else if (aWireExplorer.Orientation() == TopAbs_REVERSED)
744 for (Standard_Real wc = ll - dw; wc >= ff; wc -= dw)
746 WirePoints.Append (cu3d.Value (wc));
753 Standard_Integer ArrayPosition = WirePoints.Length();
755 Handle(TColgp_HArray1OfPnt) facepoints = new TColgp_HArray1OfPnt (1, ArrayPosition);
756 for (Standard_Integer I = 1; I <= ArrayPosition; ++I)
758 facepoints->SetValue (I, WirePoints.Value(I));
761 if ((facepoints->Array1()).Length() > 1)
762 { //1 if only one circular edge
763 Select3D_TypeOfSensitivity TS = theInteriorFlag ? Select3D_TOS_INTERIOR : Select3D_TOS_BOUNDARY;
764 theSensitiveList.Append (new Select3D_SensitiveFace (theOwner, facepoints, TS));
766 return Standard_True;