X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMImpl%2FGEOMImpl_IGroupOperations.cxx;h=5c6619e41c896166847741cbadead8fea3404269;hb=cb32f89e648187ff92eacc3addecc551b25b25df;hp=f9c99baa182c34ce6241d04fc41f84f2fef93e59;hpb=239f8109c64fa0c5a2e1d87a420bad5529b57f48;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx b/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx index f9c99baa1..5c6619e41 100644 --- a/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx @@ -1,4 +1,6 @@ -// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // // This library is free software; you can redistribute it and/or @@ -6,7 +8,7 @@ // License as published by the Free Software Foundation; either // version 2.1 of the License. // -// This library is distributed in the hope that it will be useful +// This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. @@ -16,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -88,7 +89,7 @@ Handle(GEOM_Object) GEOMImpl_IGroupOperations::CreateGroup //Set a GROUP type aGroup->SetType(GEOM_GROUP); - //Set a sub shape type + //Set a sub-shape type TDF_Label aFreeLabel = aGroup->GetFreeLabel(); TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)theShapeType); @@ -145,8 +146,8 @@ void GEOMImpl_IGroupOperations::AddObject(Handle(GEOM_Object) theGroup, int theS for(Standard_Integer i = 1; i<=aLength; i++) { aNewSeq->SetValue(i, aSeq->Value(i)); if(aSeq->Value(i) == theSubShapeID) { - SetErrorCode(ALREADY_PRESENT); - return; // + SetErrorCode(ALREADY_PRESENT); + return; // } } aNewSeq->SetValue(aLength+1, theSubShapeID); @@ -248,7 +249,8 @@ void GEOMImpl_IGroupOperations::UnionList (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; } @@ -295,6 +297,7 @@ void GEOMImpl_IGroupOperations::UnionList (Handle(GEOM_Object) theGroup, Handle(GEOM_Object) anObj_i = Handle(GEOM_Object)::DownCast(theSubShapes->Value(i)); TopoDS_Shape aShape_i = anObj_i->GetValue(); + if ( aShape_i.IsNull() ) continue; TopAbs_ShapeEnum aType_i = aShape_i.ShapeType(); // 1. If aShape_i is sub-shape of aMainShape - add it @@ -394,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; } @@ -411,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; @@ -446,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); } } @@ -460,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); } } @@ -473,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); } } @@ -483,14 +488,20 @@ void GEOMImpl_IGroupOperations::DifferenceList (Handle(GEOM_Object) theGroup, 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); @@ -528,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; } @@ -566,13 +578,17 @@ void GEOMImpl_IGroupOperations::UnionIDs (Handle(GEOM_Object) theGroup, TopTools_IndexedMapOfShape mapIndices; TopExp::MapShapes(aMainShape, mapIndices); + // Get group type + TopAbs_ShapeEnum aType = GetType(theGroup); + // Get IDs of sub-shapes to add Standard_Integer i, new_id; for (i = 1; i <= aLen; i++) { new_id = theSubShapes->Value(i); if (0 < new_id && new_id <= mapIndices.Extent()) { - if (mapIDs.Add(new_id)) { + //if (mapIDs.Add(new_id)) { IPAL21297. Why we ignore invalid ids silently? + if (mapIDs.Add(new_id) && mapIndices(new_id).ShapeType()==aType ) { aNewIDs.Append(new_id); } } @@ -616,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; } @@ -633,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; @@ -659,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); @@ -732,8 +756,8 @@ Handle(GEOM_Object) GEOMImpl_IGroupOperations::GetMainShape (Handle(GEOM_Object) if (aMainShape.IsNull()) return NULL; //Make a Python command - GEOM::TPythonDump(aGroupFunction, /*append=*/true) - << aMainShape << " = geompy.GetMainShape(" << theGroup << ")"; + //GEOM::TPythonDump(aGroupFunction, /*append=*/true) + // << aMainShape << " = geompy.GetMainShape(" << theGroup << ")"; SetErrorCode(OK); return aMainShape;