From b32a23e73cf21a0783fc1377f4e7d1738f952b32 Mon Sep 17 00:00:00 2001 From: jfa Date: Wed, 25 Jan 2006 11:57:51 +0000 Subject: [PATCH] PAL11298: Problem with GetInPlace() solved. --- src/GEOMImpl/GEOMImpl_IShapesOperations.cxx | 86 +++++++++++++++++---- 1 file changed, 71 insertions(+), 15 deletions(-) diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx index c0bd17527..760907bde 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx @@ -87,6 +87,8 @@ #include #include #include +#include +#include #include #include @@ -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; + } } } } -- 2.39.2