#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>
* 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)
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;
+ }
}
}
}