]> OCCT Git - occt.git/commitdiff
0033736: Shape Healing - Recursively update ShapeBuild_ReShape in ShapeCustom::ApplyM... CR33736
authorFtpSantos <francisco.santos@opencascade.com>
Tue, 6 Aug 2024 10:28:42 +0000 (11:28 +0100)
committeroan <oan@opencascade.com>
Thu, 8 Aug 2024 15:01:25 +0000 (16:01 +0100)
Passed ShapeBuild_ReShape to recursive call to retrieve complete change history

src/ShapeCustom/ShapeCustom.cxx

index 5e4ab7f82eeceefc3fe3e232c0522b75ae292543..faf9135a1918b8028d6c63328bb0d69c3ca5a6ac 100644 (file)
 
 #include <Message_ProgressScope.hxx>
 
+namespace
+{
+  //=======================================================================
+  //function : UpdateShapeBuild
+  //purpose  : Recursively updates ShapeBuild_ReShape to add information of all sub-shapes
+  //=======================================================================
+
+  void UpdateShapeBuild (const TopoDS_Shape&               theShape,
+                         const BRepTools_Modifier&         theModifier,
+                         const Handle(ShapeBuild_ReShape)& theReShape)
+  {
+    for (TopoDS_Iterator anIterator (theShape, Standard_False); anIterator.More(); anIterator.Next())
+    {
+      const TopoDS_Shape& aCurrent = anIterator.Value();
+      TopoDS_Shape aResult;
+      try
+      {
+        OCC_CATCH_SIGNALS
+        aResult = theModifier.ModifiedShape (aCurrent);
+      }
+      catch (Standard_NoSuchObject const &)
+      {
+        // the sub shape isn't in the map
+        aResult.Nullify();
+      }
+
+      if (!aResult.IsNull() && !aCurrent.IsSame (aResult))
+      {
+        theReShape->Replace (aCurrent, aResult);
+        UpdateShapeBuild (aCurrent, theModifier, theReShape);
+      }
+    }
+  }
+}
+
 //=======================================================================
 //function : ApplyModifier
 //purpose  : static
@@ -69,7 +104,7 @@ TopoDS_Shape ShapeCustom::ApplyModifier (const TopoDS_Shape &S,
       if ( context.IsBound ( shape ) )
         res = context.Find ( shape ).Oriented ( shape.Orientation() );
       else
-        res = ApplyModifier ( shape, M, context ,MD, aRange);
+        res = ApplyModifier ( shape, M, context ,MD, aRange, aReShape );
 
       if ( ! res.IsSame ( shape ) ) {
         context.Bind ( shape, res );
@@ -98,26 +133,7 @@ TopoDS_Shape ShapeCustom::ApplyModifier (const TopoDS_Shape &S,
   if ( !aPS.More() || !MD.IsDone() ) return S;
   if ( !aReShape.IsNull() )
   {
-    for(TopoDS_Iterator theIterator(SF,Standard_False);theIterator.More();theIterator.Next())
-    {
-      const TopoDS_Shape & current = theIterator.Value();
-      TopoDS_Shape result;
-      try
-      {
-        OCC_CATCH_SIGNALS
-        result = MD.ModifiedShape( current );
-      }
-      catch (Standard_NoSuchObject const&)
-      {
-        // the sub shape isn't in the map
-        result.Nullify();
-      }
-
-      if (!result.IsNull() && !current.IsSame(result))
-      {
-        aReShape->Replace(current, result);
-      }
-    }
+    UpdateShapeBuild (SF, MD, aReShape);
   }
 
   return MD.ModifiedShape(SF).Oriented(S.Orientation());