]> OCCT Git - occt.git/commitdiff
0032015: Visualization - Select3D_SensitiveTriangulation::myDetectedIdx is inaccessible
authorkgv <kgv@opencascade.com>
Tue, 22 Dec 2020 13:12:57 +0000 (16:12 +0300)
committerbugmaster <bugmaster@opencascade.com>
Wed, 23 Dec 2020 16:42:48 +0000 (19:42 +0300)
Added Select3D_SensitiveTriangulation::LastDetectedTriangle() property.

src/Select3D/Select3D_SensitiveTriangulation.cxx
src/Select3D/Select3D_SensitiveTriangulation.hxx
src/ViewerTest/ViewerTest.cxx

index ad7677011be3ef2ac70dbd885ec919f007e0c7f3..32254ddfdd794b79ec294e0dedfbf1cd0ca84bff 100644 (file)
@@ -254,6 +254,39 @@ void Select3D_SensitiveTriangulation::Swap (const Standard_Integer theIdx1,
   myBVHPrimIndexes->ChangeValue (theIdx2) = anElemIdx1;
 }
 
+//=======================================================================
+// function : LastDetectedTriangle
+// purpose  :
+//=======================================================================
+bool Select3D_SensitiveTriangulation::LastDetectedTriangle (Poly_Triangle& theTriangle) const
+{
+  const Standard_Integer anIndex = LastDetectedTriangleIndex();
+  if (anIndex != -1)
+  {
+    theTriangle = myTriangul->Triangle (anIndex);
+    return true;
+  }
+  return false;
+}
+
+//=======================================================================
+// function : LastDetectedTriangle
+// purpose  :
+//=======================================================================
+bool Select3D_SensitiveTriangulation::LastDetectedTriangle (Poly_Triangle& theTriangle,
+                                                            gp_Pnt theTriNodes[3]) const
+{
+  if (!LastDetectedTriangle (theTriangle))
+  {
+    return false;
+  }
+
+  theTriNodes[0] = myTriangul->Nodes().Value (theTriangle.Value (1)).Transformed (myInitLocation.Transformation());;
+  theTriNodes[1] = myTriangul->Nodes().Value (theTriangle.Value (2)).Transformed (myInitLocation.Transformation());;
+  theTriNodes[2] = myTriangul->Nodes().Value (theTriangle.Value (3)).Transformed (myInitLocation.Transformation());;
+  return true;
+}
+
 //=======================================================================
 // function : overlapsElement
 // purpose  : Checks whether the element with index theIdx overlaps the
index 4afabf5e54a46c2ba455475381aa308243c0a323..550a3333c527cda2a3875c6b6a487d3a1f274d69 100644 (file)
@@ -53,6 +53,29 @@ public:
                                                    const Handle(TColStd_HArray1OfInteger)& theFreeEdges,
                                                    const gp_Pnt& theCOG,
                                                    const Standard_Boolean theIsInterior);
+public:
+
+  //! Get last detected triangle.
+  //! @param theTriangle [out] triangle node indexes
+  //! @return TRUE if defined
+  Standard_EXPORT bool LastDetectedTriangle (Poly_Triangle& theTriangle) const;
+
+  //! Get last detected triangle.
+  //! @param theTriangle [out] triangle node indexes
+  //! @param theTriNodes [out] triangle nodes (with pre-applied transformation)
+  //! @return TRUE if defined
+  Standard_EXPORT bool LastDetectedTriangle (Poly_Triangle& theTriangle,
+                                             gp_Pnt theTriNodes[3]) const;
+
+  //! Return index of last detected triangle within [1..NbTris] range, or -1 if undefined.
+  Standard_Integer LastDetectedTriangleIndex() const
+  {
+    return (myDetectedIdx != -1 && mySensType == Select3D_TOS_INTERIOR && !myBVHPrimIndexes.IsNull())
+          ? myBVHPrimIndexes->Value (myDetectedIdx) + 1
+          : -1;
+  }
+
+public:
 
   //! Returns the amount of nodes in triangulation
   Standard_EXPORT virtual Standard_Integer NbSubElements() const Standard_OVERRIDE;
@@ -118,7 +141,7 @@ private:
                                                             Standard_Integer theElemIdx,
                                                             Standard_Boolean theIsFullInside) Standard_OVERRIDE;
 
-private:
+protected:
 
   Handle(Poly_Triangulation)       myTriangul;
   TopLoc_Location                  myInitLocation;
index e5a5ea437b6bf090cd6c81bece8753d78125d948..66f28e762b1455156aaf676779b1fa9b9ec7e08d 100644 (file)
@@ -60,6 +60,7 @@
 #include <Prs3d_PointAspect.hxx>
 #include <Select3D_SensitiveWire.hxx>
 #include <Select3D_SensitivePrimitiveArray.hxx>
+#include <Select3D_SensitiveTriangulation.hxx>
 #include <SelectMgr_EntityOwner.hxx>
 #include <StdSelect_BRepOwner.hxx>
 #include <StdSelect_ViewerSelector3d.hxx>
@@ -5514,30 +5515,32 @@ static Standard_Integer VState (Draw_Interpretor& theDI,
             << " (" << anEntity->DynamicType()->Name() << ")"
             << "\n";
 
-      Handle(StdSelect_BRepOwner) aBRepOwner = Handle(StdSelect_BRepOwner)::DownCast (anOwner);
-      if (!aBRepOwner.IsNull())
+      if (Handle(StdSelect_BRepOwner) aBRepOwner = Handle(StdSelect_BRepOwner)::DownCast (anOwner))
       {
         theDI << "                       Detected Shape: "
               << aBRepOwner->Shape().TShape()->DynamicType()->Name()
               << "\n";
       }
 
-      Handle(Select3D_SensitiveWire) aWire = Handle(Select3D_SensitiveWire)::DownCast (anEntity);
-      if (!aWire.IsNull())
+      if (Handle(Select3D_SensitiveWire) aWire = Handle(Select3D_SensitiveWire)::DownCast (anEntity))
       {
         Handle(Select3D_SensitiveEntity) aSen = aWire->GetLastDetected();
         theDI << "                       Detected Child: "
               << aSen->DynamicType()->Name()
               << "\n";
       }
-
-      Handle(Select3D_SensitivePrimitiveArray) aPrimArr = Handle(Select3D_SensitivePrimitiveArray)::DownCast (anEntity);
-      if (!aPrimArr.IsNull())
+      else if (Handle(Select3D_SensitivePrimitiveArray) aPrimArr = Handle(Select3D_SensitivePrimitiveArray)::DownCast (anEntity))
       {
         theDI << "                       Detected Element: "
               << aPrimArr->LastDetectedElement()
               << "\n";
       }
+      else if (Handle(Select3D_SensitiveTriangulation) aTriSens = Handle(Select3D_SensitiveTriangulation)::DownCast (anEntity))
+      {
+        theDI << "                       Detected Triangle: "
+              << aTriSens->LastDetectedTriangleIndex()
+              << "\n";
+      }
     }
     return 0;
   }