]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
0021835: EDF 2070 GEOM : Problem with detecting Self-intersections
authorskv <skv@opencascade.com>
Mon, 17 Jun 2013 07:20:09 +0000 (07:20 +0000)
committerskv <skv@opencascade.com>
Mon, 17 Jun 2013 07:20:09 +0000 (07:20 +0000)
src/NMTTools/NMTTools_PaveFiller_2.cxx
src/NMTTools/NMTTools_PaveFiller_4.cxx
src/NMTTools/NMTTools_PaveFiller_5.cxx
src/NMTTools/NMTTools_PaveFiller_6.cxx
src/NMTTools/NMTTools_PaveFiller_7.cxx
src/NMTTools/NMTTools_Tools.cxx
src/NMTTools/NMTTools_Tools.hxx

index 19792f45b4ec6e8fc232a828ac22a3cf7dbc024a..98c04569191e7addd07c7bd47b15ab42206f0cf3 100644 (file)
@@ -27,6 +27,7 @@
 #include <Standard_Version.hxx>
 
 #include <NMTTools_PaveFiller.hxx>
+#include <NMTTools_Tools.hxx>
 
 #include <Basics_OCCTVersion.hxx>
 
@@ -117,7 +118,7 @@ void NMTTools_PaveFiller::PerformVE()
       }
       // Edge
       aE2=TopoDS::Edge(myDS->Shape(aWith));
-      if (BRep_Tool::Degenerated(aE2)){
+      if (NMTTools_Tools::IsDegenerated(aE2)){
         continue;
       }
       // Vertex
@@ -221,7 +222,7 @@ void NMTTools_PaveFiller::PrepareEdges()
     if (myDS->GetShapeType(i)==TopAbs_EDGE) {
       aE=TopoDS::Edge(myDS->Shape(i));
       //
-      if (BRep_Tool::Degenerated(aE)){
+      if (NMTTools_Tools::IsDegenerated(aE)){
         continue;
       }
       //
index 397481e95191ab002721852408821e499bf2c352..ef774277e0fdc5c63b4bd19998a07ef8f1b31f37 100644 (file)
@@ -24,6 +24,7 @@
 //  Author:      Peter KURNEV
 
 #include <NMTTools_PaveFiller.hxx>
+#include <NMTTools_Tools.hxx>
 
 #include <stdio.h>
 #include <Precision.hxx>
@@ -184,7 +185,8 @@ void NMTTools_PaveFiller::PerformEE()
     const TopoDS_Edge aE1=TopoDS::Edge(myDS->Shape(nE1));//mpv
     const TopoDS_Edge aE2=TopoDS::Edge(myDS->Shape(nE2));//mpv
     //
-    if (BRep_Tool::Degenerated(aE1) || BRep_Tool::Degenerated(aE2)){
+    if (NMTTools_Tools::IsDegenerated(aE1) ||
+        NMTTools_Tools::IsDegenerated(aE2)){
       continue;
     }
     //
@@ -955,7 +957,7 @@ void NMTTools_PaveFiller::PreparePaveBlocks(const Standard_Integer nE)
   BOPTools_ListOfPaveBlock& aLPB=mySplitShapesPool(myDS->RefEdge(nE));
   // Edge
   aE=TopoDS::Edge(myDS->Shape(nE));
-  if (BRep_Tool::Degenerated(aE)) {
+  if (NMTTools_Tools::IsDegenerated(aE)) {
     myIsDone=Standard_True;
     return;
   }
index 4ee66534c81f61c1c0a6e2c376d760a15919a273..f97bf96010af1826d791052d5fd62e2ffa445448 100644 (file)
@@ -74,6 +74,7 @@
 #include <BOPTools_ESInterference.hxx>
 #include <BOPTools_IDMapOfPaveBlockIMapOfInteger.hxx>
 #include <BOPTools_IMapOfPaveBlock.hxx>
+#include <BRepTools.hxx>
 
 #include <NMTDS_ShapesDataStructure.hxx>
 #include <NMTDS_Iterator.hxx>
@@ -84,6 +85,7 @@
 #include <NMTTools_IndexedDataMapOfIndexedMapOfInteger.hxx>
 #include <NMTTools_CommonBlockAPI.hxx>
 #include <NMTTools_ListOfCommonBlock.hxx>
+#include <NMTTools_Tools.hxx>
 
 
 static
@@ -146,7 +148,7 @@ static
     //
     // Edge
     const TopoDS_Edge aE=TopoDS::Edge(myDS->Shape(nE));
-    if (BRep_Tool::Degenerated(aE)){
+    if (NMTTools_Tools::IsDegenerated(aE)){
       continue;
     }
     //
@@ -199,6 +201,8 @@ static
       BOPTools_Tools::CorrectRange(aE, aF, aSR, anewSR);
       aEF.SetRange (anewSR);
       //
+      BRepTools::Write(aE, "/dn20/salome/skv/SALOME/scripts/Dumps/edge");
+      BRepTools::Write(aF, "/dn20/salome/skv/SALOME/scripts/Dumps/face");
       aEF.Perform();
       //
       if (aEF.IsDone()) {
index 3d7270c900355e59f3980bf45bbbe8eb368432c2..81df58ce89cb8d1709e0b4bb691dd45dcedb3186 100644 (file)
@@ -782,7 +782,7 @@ void NMTTools_PaveFiller::MakePCurves()
     }
     const TopoDS_Edge& aE=TopoDS::Edge(aS);
     //
-    if (BRep_Tool::Degenerated(aE)) {
+    if (NMTTools_Tools::IsDegenerated(aE)) {
       continue;
     }
     //
index e8c2282370a1333c20f6b5f6760b6873edd7bfff..2ffafd19f88f4d5abb5abdf2751b869e6842c8c9 100644 (file)
@@ -24,6 +24,7 @@
 // Author:      Peter KURNEV
 
 #include <NMTTools_PaveFiller.hxx>
+#include <NMTTools_Tools.hxx>
 
 #include <Bnd_HArray1OfBox.hxx>
 #include <Bnd_BoundSortBox.hxx>
@@ -108,7 +109,7 @@ void NMTTools_PaveFiller::MakeSplitEdges()
     //
     // Original Edge
     aE=TopoDS::Edge(myDS->Shape(i));
-    if (BRep_Tool::Degenerated(aE)){
+    if (NMTTools_Tools::IsDegenerated(aE)){
       continue;
     }
     //
@@ -198,7 +199,7 @@ void NMTTools_PaveFiller::UpdateCommonBlocks(const Standard_Integer)
     }
     //
     const TopoDS_Edge& aE=*((TopoDS_Edge*)&myDS->Shape(nE));
-    if (BRep_Tool::Degenerated(aE)){
+    if (NMTTools_Tools::IsDegenerated(aE)){
       continue;
     }
     //
@@ -371,7 +372,7 @@ void NMTTools_PaveFiller::UpdateCommonBlocks()
     if (myDS->GetShapeType(nE)!=TopAbs_EDGE){
       continue;
     }
-    if (BRep_Tool::Degenerated(TopoDS::Edge(myDS->Shape(nE)))){
+    if (NMTTools_Tools::IsDegenerated(TopoDS::Edge(myDS->Shape(nE)))){
       continue;
     }
     //
@@ -489,7 +490,7 @@ void NMTTools_PaveFiller::UpdatePaveBlocks()
     for(; aExp.More();  aExp.Next()) {
       aE=TopoDS::Edge(aExp.Current());
       //
-      if (BRep_Tool::Degenerated(aE)) {
+      if (NMTTools_Tools::IsDegenerated(aE)) {
         continue;
       }
       //
index 8f6588d5c39d0cda9dc073e828f36f274ca47917..9ae202c8a932fddf16e7d722b980e7ff84dcc312 100644 (file)
@@ -73,6 +73,7 @@
 #include <TopTools_MapOfShape.hxx>
 #include <TopTools_MapIteratorOfMapOfShape.hxx>
 #include <TopoDS_Iterator.hxx>
+#include <Precision.hxx>
 
 static
   void ProcessBlock(const Standard_Integer iV,
@@ -612,3 +613,39 @@ void ProcessBlock(const TopoDS_Shape& aF,
     ProcessBlock(aFx, aMCV, aProcessed, aChain);
   }
 }
+
+//=======================================================================
+// function: IsDegenerated
+// purpose :
+//=======================================================================
+Standard_Boolean NMTTools_Tools::IsDegenerated(const TopoDS_Edge &theEdge)
+{
+  Standard_Boolean aResult = BRep_Tool::Degenerated(theEdge);
+
+  if (!aResult) {
+    // Check if there is a null-length 3d curve.
+    Standard_Real aF;
+    Standard_Real aL;
+    Handle(Geom_Curve) aCrv = BRep_Tool::Curve(theEdge, aF, aL);
+
+    aResult = aCrv.IsNull();
+
+    if (!aResult) {
+      const Standard_Real aTolConf2 =
+          Precision::Confusion()*Precision::Confusion();
+      gp_Pnt aPnt[2] = { aCrv->Value(aF), aCrv->Value(aL) };
+
+      if (aPnt[0].SquareDistance(aPnt[1]) <= aTolConf2) {
+        // Check the middle point.
+        const gp_Pnt aPMid = aCrv->Value(0.5*(aF + aL));
+
+        if (aPnt[0].SquareDistance(aPMid) <= aTolConf2) {
+          // 3D curve is degenerated.
+          aResult = Standard_True;
+        }
+      }
+    }
+  }
+
+  return aResult;
+}
index 5924d02a9887773ab5ca33332df8f3f7ab29f90b..7bb2f87cbb5655688a84c6a8e73baffd8fc3c99e 100644 (file)
@@ -95,5 +95,8 @@ class NMTTools_Tools  {
     static  void UpdateEdge(const TopoDS_Edge& aE,
                            const Standard_Real aTol) ;
 
+  Standard_EXPORT
+    static Standard_Boolean IsDegenerated(const TopoDS_Edge &theEdge);
+
 };
 #endif