-// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012 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
+// 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
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// 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,
-// 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.
+// 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.
//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#include <Standard_Stream.hxx>
//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);
SetErrorCode(KO);
if(theGroup.IsNull()) return;
- Handle(GEOM_Function) aFunction = theGroup->GetFunction(1);
+ Handle(GEOM_Function) aFunction = theGroup->GetLastFunction();
if(aFunction.IsNull()) return;
GEOM_ISubShape aSSI (aFunction);
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);
- aSSI.SetIndices(aNewSeq);
+ if ( aFunction->IsLastFuntion() ) {
+ aSSI.SetIndices(aNewSeq);
+ }
+ else {
+ aFunction = theGroup->AddFunction( GEOM_Object::GetSubShapeID(), 0, true );
+ GEOM_ISubShape aSSI2 (aFunction);
+ aSSI2.SetIndices(aNewSeq);
+ aSSI2.SetMainShape( aSSI.GetMainShape() );
+ }
}
// As we do not recompute here our group, lets mark it as Modified
SetErrorCode(KO);
if(theGroup.IsNull()) return;
- Handle(GEOM_Function) aFunction = theGroup->GetFunction(1);
+ Handle(GEOM_Function) aFunction = theGroup->GetLastFunction();
if(aFunction.IsNull()) return;
GEOM_ISubShape aSSI(aFunction);
}
}
- aSSI.SetIndices(aNewSeq);
+ if ( aFunction->IsLastFuntion() ) {
+ aSSI.SetIndices(aNewSeq);
+ }
+ else {
+ aFunction = theGroup->AddFunction( GEOM_Object::GetSubShapeID(), 0, true );
+ GEOM_ISubShape aSSI2 (aFunction);
+ aSSI2.SetIndices(aNewSeq);
+ aSSI2.SetMainShape( aSSI.GetMainShape() );
+ }
// As we do not recompute here our group, lets mark it as Modified
TDF_Label aLabel = aSSI.GetMainShape()->GetOwnerEntry();
Standard_Integer aLen = theSubShapes->Length();
if (aLen < 1) {
- SetErrorCode("The list is empty");
+ //SetErrorCode("The list is empty");
+ SetErrorCode(OK);
return;
}
- Handle(GEOM_Function) aFunction = theGroup->GetFunction(1);
+ Handle(GEOM_Function) aFunction = theGroup->GetLastFunction();
if (aFunction.IsNull()) return;
GEOM_ISubShape aSSI (aFunction);
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
for (; aNewIDsIter.More(); aNewIDsIter.Next(), k++) {
aNewSeq->SetValue(k, aNewIDsIter.Value());
}
-
- aSSI.SetIndices(aNewSeq);
-
+ if ( aFunction->IsLastFuntion() ) {
+ aSSI.SetIndices(aNewSeq);
+ }
+ else {
+ aFunction = theGroup->AddFunction( GEOM_Object::GetSubShapeID(), 0, true );
+ GEOM_ISubShape aSSI2 (aFunction);
+ aSSI2.SetIndices(aNewSeq);
+ aSSI2.SetMainShape(aMainShapeFunc);
+ }
// As we do not recompute here our group, lets mark it as Modified
Standard_Integer aTic = aMainObj->GetTic(); // tic of main shape
theGroup->SetTic(aTic - 1);
}
//Make a Python command
- Handle(GEOM_Object) aLatest = GEOM::GetCreatedLast(theSubShapes);
- aLatest = GEOM::GetCreatedLast(aLatest, theGroup);
- Handle(GEOM_Function) aLastFunc = aLatest->GetLastFunction();
-
- GEOM::TPythonDump pd (aLastFunc, /*append=*/true);
+ GEOM::TPythonDump pd (aFunction, /*append=*/true);
pd << "geompy.UnionList(" << theGroup << ", [";
for (i = 1; i <= aLen; i++) {
Standard_Integer aLen = theSubShapes->Length();
if (aLen < 1) {
- SetErrorCode("The list is empty");
+ //SetErrorCode("The list is empty");
+ SetErrorCode(OK);
return;
}
- Handle(GEOM_Function) aFunction = theGroup->GetFunction(1);
+ Handle(GEOM_Function) aFunction = theGroup->GetLastFunction();
if (aFunction.IsNull()) return;
GEOM_ISubShape aSSI (aFunction);
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;
// 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);
}
}
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);
}
}
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);
}
}
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);
-
+ if ( aFunction->IsLastFuntion() ) {
+ aSSI.SetIndices(aNewSeq);
+ }
+ else {
+ aFunction = theGroup->AddFunction( GEOM_Object::GetSubShapeID(), 0, true );
+ GEOM_ISubShape aSSI2 (aFunction);
+ aSSI2.SetIndices(aNewSeq);
+ aSSI2.SetMainShape(aMainShapeFunc);
+ }
// As we do not recompute here our group, lets mark it as Modified
Standard_Integer aTic = aMainObj->GetTic(); // tic of main shape
theGroup->SetTic(aTic - 1);
}
//Make a Python command
- Handle(GEOM_Object) aLatest = GEOM::GetCreatedLast(theSubShapes);
- aLatest = GEOM::GetCreatedLast(aLatest, theGroup);
- Handle(GEOM_Function) aLastFunc = aLatest->GetLastFunction();
-
- GEOM::TPythonDump pd (aLastFunc, /*append=*/true);
+ GEOM::TPythonDump pd (aFunction, /*append=*/true);
pd << "geompy.DifferenceList(" << theGroup << ", [";
for (i = 1; i <= aLen; i++) {
Standard_Integer aLen = theSubShapes->Length();
if (aLen < 1) {
- SetErrorCode("The list is empty");
+ //SetErrorCode("The list is empty");
+ SetErrorCode(OK);
return;
}
- Handle(GEOM_Function) aFunction = theGroup->GetFunction(1);
+ Handle(GEOM_Function) aFunction = theGroup->GetLastFunction();
if (aFunction.IsNull()) return;
GEOM_ISubShape aSSI (aFunction);
for (; aNewIDsIter.More(); aNewIDsIter.Next(), k++) {
aNewSeq->SetValue(k, aNewIDsIter.Value());
}
-
- aSSI.SetIndices(aNewSeq);
-
+ if ( aFunction->IsLastFuntion() ) {
+ aSSI.SetIndices(aNewSeq);
+ }
+ else {
+ aFunction = theGroup->AddFunction( GEOM_Object::GetSubShapeID(), 0, true );
+ GEOM_ISubShape aSSI2 (aFunction);
+ aSSI2.SetIndices(aNewSeq);
+ aSSI2.SetMainShape(aMainShapeFunc);
+ }
// As we do not recompute here our group, lets mark it as Modified
Standard_Integer aTic = aMainObj->GetTic(); // tic of main shape
theGroup->SetTic(aTic - 1);
Standard_Integer aLen = theSubShapes->Length();
if (aLen < 1) {
- SetErrorCode("The list is empty");
+ //SetErrorCode("The list is empty");
+ SetErrorCode(OK);
return;
}
- Handle(GEOM_Function) aFunction = theGroup->GetFunction(1);
+ Handle(GEOM_Function) aFunction = theGroup->GetLastFunction();
if (aFunction.IsNull()) return;
GEOM_ISubShape aSSI (aFunction);
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;
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++;
+ }
}
}
-
- aSSI.SetIndices(aNewSeq);
-
+ else {
+ aNewSeq = new TColStd_HArray1OfInteger(1,1);
+ aNewSeq->SetValue(1, -1);
+ }
+ if ( aFunction->IsLastFuntion() ) {
+ aSSI.SetIndices(aNewSeq);
+ }
+ else {
+ aFunction = theGroup->AddFunction( GEOM_Object::GetSubShapeID(), 0, true );
+ GEOM_ISubShape aSSI2 (aFunction);
+ aSSI2.SetIndices(aNewSeq);
+ aSSI2.SetMainShape(aMainShapeFunc);
+ }
// As we do not recompute here our group, lets mark it as Modified
Standard_Integer aTic = aMainObj->GetTic(); // tic of main shape
theGroup->SetTic(aTic - 1);
if(theGroup.IsNull()) return NULL;
- Handle(GEOM_Function) aFunction = theGroup->GetFunction(1);
+ Handle(GEOM_Function) aFunction = theGroup->GetLastFunction();
if(aFunction.IsNull()) return NULL;
GEOM_ISubShape aSSI(aFunction);