Salome HOME
[bos #33189] EDF 26580 - Problem with Pipe jfa/33189_Problem_with_Pipe 11/head
authorjfa <jfa@opencascade.com>
Thu, 18 May 2023 11:18:29 +0000 (12:18 +0100)
committerjfa <jfa@opencascade.com>
Thu, 18 May 2023 11:18:29 +0000 (12:18 +0100)
src/GeomAlgoAPI/GeomAlgoAPI_Pipe.cpp

index 38599fd00cb7873ef36f5b4071059785b8d7aa39..796c50b55d3d87d3445b770927bc7432dcf85da8 100644 (file)
@@ -107,28 +107,54 @@ void GeomAlgoAPI_Pipe::build(const GeomShapePtr theBaseShape,
     addMovedPath(anOldPath, aNewPath);
 
   // Making pipe.
-  BRepOffsetAPI_MakePipe* aPipeBuilder = new BRepOffsetAPI_MakePipe(aPathWire, aBaseShape);
-  if(!aPipeBuilder) {
-    return;
+  BRepOffsetAPI_MakePipe* aPipeBuilder = NULL;
+  try {
+    aPipeBuilder = new BRepOffsetAPI_MakePipe(aPathWire, aBaseShape);
+  }
+  catch (...) {
   }
-  aPipeBuilder->Build();
 
   // Checking result.
-  if (!aPipeBuilder->IsDone() || aPipeBuilder->Shape().IsNull()) {
-    delete aPipeBuilder;
-    return;
+  bool isDone = false;
+  static const Standard_Real TolPipeSurf = 5.e-4;
+  if (aPipeBuilder &&
+      aPipeBuilder->IsDone() &&
+      !aPipeBuilder->Shape().IsNull() &&
+      aPipeBuilder->ErrorOnSurface() <= TolPipeSurf) {
+    // check result
+    BOPAlgo_ArgumentAnalyzer aChecker;
+    aChecker.SetShape1(aPipeBuilder->Shape());
+    aChecker.SelfInterMode() = Standard_True;
+    aChecker.StopOnFirstFaulty() = Standard_True;
+    aChecker.Perform();
+    if (!aChecker.HasFaulty())
+      isDone = true;
   }
 
-  // Check for self-interfering result
-  BOPAlgo_ArgumentAnalyzer aChecker;
-  aChecker.SetShape1(aPipeBuilder->Shape());
-  aChecker.SelfInterMode() = Standard_True;
-  aChecker.StopOnFirstFaulty() = Standard_True;
-  aChecker.Perform();
-  if (aChecker.HasFaulty()) {
-    myError = "Self-interfering result.";
-    delete aPipeBuilder;
-    return;
+  if (!isDone) {
+    if (aPipeBuilder)
+      delete aPipeBuilder;
+
+    // Try to use Descrete Trihedron mode.
+    aPipeBuilder = new BRepOffsetAPI_MakePipe
+      (aPathWire, aBaseShape, GeomFill_IsDiscreteTrihedron, Standard_True);
+    if (!aPipeBuilder->IsDone() || aPipeBuilder->Shape().IsNull()) {
+      myError = "Pipe algorithm has failed.";
+      delete aPipeBuilder;
+      return;
+    }
+
+    // Check for self-interfering result
+    BOPAlgo_ArgumentAnalyzer aChecker;
+    aChecker.SetShape1(aPipeBuilder->Shape());
+    aChecker.SelfInterMode() = Standard_True;
+    aChecker.StopOnFirstFaulty() = Standard_True;
+    aChecker.Perform();
+    if (aChecker.HasFaulty()) {
+      myError = "Self-interfering result.";
+      delete aPipeBuilder;
+      return;
+    }
   }
 
   this->initialize(aPipeBuilder);