From 73dc2d3ae56052deac2d8c5881688b42ced10c7e Mon Sep 17 00:00:00 2001 From: kgv Date: Tue, 22 Dec 2020 16:12:57 +0300 Subject: [PATCH] 0032015: Visualization - Select3D_SensitiveTriangulation::myDetectedIdx is inaccessible Added Select3D_SensitiveTriangulation::LastDetectedTriangle() property. --- .../Select3D_SensitiveTriangulation.cxx | 33 +++++++++++++++++++ .../Select3D_SensitiveTriangulation.hxx | 25 +++++++++++++- src/ViewerTest/ViewerTest.cxx | 17 ++++++---- 3 files changed, 67 insertions(+), 8 deletions(-) diff --git a/src/Select3D/Select3D_SensitiveTriangulation.cxx b/src/Select3D/Select3D_SensitiveTriangulation.cxx index ad7677011b..32254ddfdd 100644 --- a/src/Select3D/Select3D_SensitiveTriangulation.cxx +++ b/src/Select3D/Select3D_SensitiveTriangulation.cxx @@ -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 diff --git a/src/Select3D/Select3D_SensitiveTriangulation.hxx b/src/Select3D/Select3D_SensitiveTriangulation.hxx index 4afabf5e54..550a3333c5 100644 --- a/src/Select3D/Select3D_SensitiveTriangulation.hxx +++ b/src/Select3D/Select3D_SensitiveTriangulation.hxx @@ -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; diff --git a/src/ViewerTest/ViewerTest.cxx b/src/ViewerTest/ViewerTest.cxx index e5a5ea437b..66f28e762b 100644 --- a/src/ViewerTest/ViewerTest.cxx +++ b/src/ViewerTest/ViewerTest.cxx @@ -60,6 +60,7 @@ #include #include #include +#include #include #include #include @@ -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; }