diff --git a/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx b/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx index 224dda4aa..82d5a89b3 100644 --- a/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx @@ -397,7 +397,8 @@ void GEOMImpl_IGroupOperations::DifferenceList (Handle(GEOM_Object) theGroup, Standard_Integer aLen = theSubShapes->Length(); if (aLen < 1) { - SetErrorCode("The list is empty"); + //SetErrorCode("The list is empty"); + SetErrorCode(OK); return; } @@ -414,8 +415,9 @@ void GEOMImpl_IGroupOperations::DifferenceList (Handle(GEOM_Object) theGroup, if (aSeq.IsNull()) return; Standard_Integer aLength = aSeq->Length(); - if (aLength == 1 && aSeq->Value(1) == -1) // empty group - return; + // VSR 28/04/2011 commented to allow operation even for empty group + // if (aLength == 1 && aSeq->Value(1) == -1) // empty group + // return; TColStd_MapOfInteger mapIDsCurrent; Standard_Integer j = 1; @@ -449,7 +451,7 @@ void GEOMImpl_IGroupOperations::DifferenceList (Handle(GEOM_Object) theGroup, // 1. If aShape_i is sub-shape of aMainShape - remove it if (mapIndices.Contains(aShape_i)) { rem_id = mapIndices.FindIndex(aShape_i); - if (mapIDsCurrent.Contains(rem_id)) { + if (rem_id > 0 && mapIDsCurrent.Contains(rem_id)) { mapIDsToRemove.Add(rem_id); } } @@ -463,7 +465,7 @@ void GEOMImpl_IGroupOperations::DifferenceList (Handle(GEOM_Object) theGroup, TopoDS_Shape aSubShape_i = mapIndices_i.FindKey(ii); if (mapIndices.Contains(aSubShape_i)) { rem_id = mapIndices.FindIndex(aSubShape_i); - if (mapIDsCurrent.Contains(rem_id)) { + if (rem_id > 0 && mapIDsCurrent.Contains(rem_id)) { mapIDsToRemove.Add(rem_id); } } @@ -476,7 +478,7 @@ void GEOMImpl_IGroupOperations::DifferenceList (Handle(GEOM_Object) theGroup, TopoDS_Shape aSubShape_i = aSubShapes_i.Current(); if (mapIndices.Contains(aSubShape_i)) { rem_id = mapIndices.FindIndex(aSubShape_i); - if (mapIDsCurrent.Contains(rem_id)) { + if (rem_id > 0 && mapIDsCurrent.Contains(rem_id)) { mapIDsToRemove.Add(rem_id); } } @@ -537,7 +539,8 @@ void GEOMImpl_IGroupOperations::UnionIDs (Handle(GEOM_Object) theGroup, Standard_Integer aLen = theSubShapes->Length(); if (aLen < 1) { - SetErrorCode("The list is empty"); + //SetErrorCode("The list is empty"); + SetErrorCode(OK); return; } @@ -629,7 +632,8 @@ void GEOMImpl_IGroupOperations::DifferenceIDs (Handle(GEOM_Object) theGroup, Standard_Integer aLen = theSubShapes->Length(); if (aLen < 1) { - SetErrorCode("The list is empty"); + //SetErrorCode("The list is empty"); + SetErrorCode(OK); return; } @@ -646,8 +650,9 @@ void GEOMImpl_IGroupOperations::DifferenceIDs (Handle(GEOM_Object) theGroup, if (aSeq.IsNull()) return; Standard_Integer aLength = aSeq->Length(); - if (aLength == 1 && aSeq->Value(1) == -1) // empty group - return; + // VSR 28/04/2011 commented to allow operation even for empty group + // if (aLength == 1 && aSeq->Value(1) == -1) // empty group + // return; TColStd_MapOfInteger mapIDsCurrent; Standard_Integer j = 1; @@ -672,21 +677,27 @@ void GEOMImpl_IGroupOperations::DifferenceIDs (Handle(GEOM_Object) theGroup, Standard_Integer i, rem_id; for (i = 1; i <= aLen; i++) { rem_id = theSubShapes->Value(i); - if (mapIDsCurrent.Contains(rem_id)) { + if (rem_id > 0 && mapIDsCurrent.Contains(rem_id)) { mapIDsToRemove.Add(rem_id); } } if (mapIDsToRemove.Extent() > 0) { Standard_Integer k = 1, aRemLength = mapIDsToRemove.Extent(); - Handle(TColStd_HArray1OfInteger) aNewSeq = new TColStd_HArray1OfInteger(1, aLength - aRemLength); - - for (j = 1; j <= aLength; j++) { - if (!mapIDsToRemove.Contains(aSeq->Value(j))) { - aNewSeq->SetValue(k, aSeq->Value(j)); - k++; + Handle(TColStd_HArray1OfInteger) aNewSeq; + if ( aLength - aRemLength > 0 ) { + aNewSeq = new TColStd_HArray1OfInteger(1, aLength - aRemLength); + for (j = 1; j <= aLength; j++) { + if (!mapIDsToRemove.Contains(aSeq->Value(j))) { + aNewSeq->SetValue(k, aSeq->Value(j)); + k++; + } } } + else { + aNewSeq = new TColStd_HArray1OfInteger(1,1); + aNewSeq->SetValue(1, -1); + } aSSI.SetIndices(aNewSeq);