]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
PAL11298: Problem with GetInPlace() solved.
authorjfa <jfa@opencascade.com>
Wed, 25 Jan 2006 11:57:51 +0000 (11:57 +0000)
committerjfa <jfa@opencascade.com>
Wed, 25 Jan 2006 11:57:51 +0000 (11:57 +0000)
src/GEOMImpl/GEOMImpl_IShapesOperations.cxx

index c0bd1752758fb40963f7225f9a303611bb9c0d38..760907bdeb1659c7658e774b2db3218831f6a637 100644 (file)
@@ -87,6 +87,8 @@
 #include <GProp_GProps.hxx>
 #include <gp_Pnt.hxx>
 #include <gp_Lin.hxx>
+#include <TColStd_ListOfInteger.hxx>
+#include <TColStd_ListIteratorOfListOfInteger.hxx>
 #include <TColStd_Array1OfReal.hxx>
 #include <TColStd_HArray1OfInteger.hxx>
 
@@ -1813,6 +1815,25 @@ Handle(TColStd_HSequenceOfInteger)
  *  GetInPlace
  */
 //=============================================================================
+static void SimplifyWhat (TopoDS_Shape& theWhat,
+                          TopTools_IndexedMapOfShape& theArgumentIndices,
+                          TColStd_ListOfInteger& theSimpleSubWhat)
+{
+  TopTools_MapOfShape mapShape;
+  TopoDS_Iterator It (theWhat, Standard_True, Standard_True);
+  for (; It.More(); It.Next()) {
+    if (mapShape.Add(It.Value())) {
+      TopoDS_Shape curSh = It.Value();
+      if (curSh.ShapeType() == TopAbs_COMPOUND ||
+          curSh.ShapeType() == TopAbs_COMPSOLID) {
+        SimplifyWhat(curSh, theArgumentIndices, theSimpleSubWhat);
+      } else {
+        theSimpleSubWhat.Append(theArgumentIndices.FindIndex(curSh));
+      }
+    }
+  }
+}
+
 Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetInPlace
                                           (Handle(GEOM_Object) theShapeWhere,
                                            Handle(GEOM_Object) theShapeWhat)
@@ -1881,21 +1902,56 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetInPlace
 
         TDF_Label aWhatHistoryLabel = anArgumentHistoryLabel.FindChild(aWhatIndex, Standard_False);
         if (aWhatHistoryLabel.IsNull()) {
-          // Removed entity
-          SetErrorCode(OK);
-          return NULL;
-        }
-
-        Handle(TDataStd_IntegerArray) anIntegerArray;
-        if (!aWhatHistoryLabel.FindAttribute(TDataStd_IntegerArray::GetID(), anIntegerArray)) {
-          SetErrorCode("Error: Empty modifications history for the sought shape.");
-          return NULL;
-        }
-
-        aModifiedArray = anIntegerArray->Array();
-        if (aModifiedArray->Length() == 0) {
-          SetErrorCode("Error: Empty modifications history for the sought shape.");
-          return NULL;
+          // Check, if the sought shape is Compound or Compsolid.
+          // In that case we will try to find history for its sub-shapes
+          if (aWhat.ShapeType() == TopAbs_COMPOUND ||
+              aWhat.ShapeType() == TopAbs_COMPSOLID) {
+            TColStd_ListOfInteger aSimpleSubWhat, aModifiedList;
+            SimplifyWhat(aWhat, anArgumentIndices, aSimpleSubWhat);
+            TColStd_ListIteratorOfListOfInteger anIterSub (aSimpleSubWhat);
+            for (; anIterSub.More(); anIterSub.Next()) {
+              Standard_Integer aSubWhatIndex = anIterSub.Value();
+              TDF_Label aSubWhatHistoryLabel =
+                anArgumentHistoryLabel.FindChild(aSubWhatIndex, Standard_False);
+              if (!aSubWhatHistoryLabel.IsNull()) {
+                Handle(TDataStd_IntegerArray) anIntegerArray;
+                if (aSubWhatHistoryLabel.FindAttribute(TDataStd_IntegerArray::GetID(), anIntegerArray)) {
+                  for (Standard_Integer isub = 1; isub <= anIntegerArray->Length(); isub++) {
+                    aModifiedList.Append(anIntegerArray->Value(isub));
+                  }
+                }
+              }
+            }
+            if (aModifiedList.Extent() > 0) {
+              Handle(TColStd_HArray1OfInteger) aModifiedArraySub =
+                new TColStd_HArray1OfInteger (1, aModifiedList.Extent());
+              TColStd_ListIteratorOfListOfInteger anIterModif (aModifiedList);
+              for (Standard_Integer imod = 1; anIterModif.More(); anIterModif.Next(), imod++) {
+                aModifiedArraySub->SetValue(imod, anIterModif.Value());
+              }
+              aModifiedArray = aModifiedArraySub;
+            } else {
+              // Removed entity
+              SetErrorCode(OK);
+              return NULL;
+            }
+          } else {
+            // Removed entity
+            SetErrorCode(OK);
+            return NULL;
+          }
+        } else {
+          Handle(TDataStd_IntegerArray) anIntegerArray;
+          if (!aWhatHistoryLabel.FindAttribute(TDataStd_IntegerArray::GetID(), anIntegerArray)) {
+            SetErrorCode("Error: Empty modifications history for the sought shape.");
+            return NULL;
+          }
+
+          aModifiedArray = anIntegerArray->Array();
+          if (aModifiedArray->Length() == 0) {
+            SetErrorCode("Error: Empty modifications history for the sought shape.");
+            return NULL;
+          }
         }
       }
     }