X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOM_I%2FGEOM_IShapesOperations_i.cc;h=751c8839cde7b2f703ca07df7752d33902810a66;hb=b6f0965afb72083a5234f9b4fb0b233adaaf8d9d;hp=cd3aac8aad1b767e866430423c0ea889b591eb7c;hpb=465e84c52edb243fa36d581abc659b1c97156c64;p=modules%2Fgeom.git diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.cc b/src/GEOM_I/GEOM_IShapesOperations_i.cc index cd3aac8aa..751c8839c 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.cc +++ b/src/GEOM_I/GEOM_IShapesOperations_i.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2022 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 @@ -6,7 +6,7 @@ // 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. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -35,6 +35,37 @@ #include #include +#include + +/** + * This function converts GEOM::comparison_condition type into + * GEOMUtils::ComparisonCondition type. + * + * \param theCondition the condition of GEOM::comparison_condition type + * \return the condition of GEOMUtils::ComparisonCondition type. + */ +static GEOMUtils::ComparisonCondition ComparisonCondition + (const GEOM::comparison_condition theCondition) +{ + GEOMUtils::ComparisonCondition aResult = GEOMUtils::CC_GT; + + switch (theCondition) { + case GEOM::CC_GE: + aResult = GEOMUtils::CC_GE; + break; + case GEOM::CC_LT: + aResult = GEOMUtils::CC_LT; + break; + case GEOM::CC_LE: + aResult = GEOMUtils::CC_LE; + break; + default: + break; + } + + return aResult; +} + //============================================================================= /*! * constructor: @@ -73,13 +104,13 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeEdge GetOperations()->SetNotDone(); //Get the reference points - Handle(GEOM_Object) aPnt1 = GetObjectImpl(thePnt1); - Handle(GEOM_Object) aPnt2 = GetObjectImpl(thePnt2); + Handle(::GEOM_Object) aPnt1 = GetObjectImpl(thePnt1); + Handle(::GEOM_Object) aPnt2 = GetObjectImpl(thePnt2); if (aPnt1.IsNull() || aPnt2.IsNull()) return aGEOMObject._retn(); //Create the Edge - Handle(GEOM_Object) anObject = GetOperations()->MakeEdge(aPnt1, aPnt2); + Handle(::GEOM_Object) anObject = GetOperations()->MakeEdge(aPnt1, aPnt2); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -102,17 +133,17 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeEdgeOnCurveByLength GetOperations()->SetNotDone(); //Get the reference curve - Handle(GEOM_Object) aRefCurve = GetObjectImpl(theCurve); + Handle(::GEOM_Object) aRefCurve = GetObjectImpl(theCurve); if (aRefCurve.IsNull()) return aGEOMObject._retn(); //Get the reference point (can be NULL) - Handle(GEOM_Object) aRefPoint; + Handle(::GEOM_Object) aRefPoint; if (!CORBA::is_nil(theStartPoint)) { aRefPoint = GetObjectImpl(theStartPoint); } //Create the point - Handle(GEOM_Object) anObject = + Handle(::GEOM_Object) anObject = GetOperations()->MakeEdgeOnCurveByLength(aRefCurve, theLength, aRefPoint); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -136,12 +167,12 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeEdgeWire GetOperations()->SetNotDone(); //Get the source wire - Handle(GEOM_Object) aWire = GetObjectImpl(theWire); + Handle(::GEOM_Object) aWire = GetObjectImpl(theWire); if (aWire.IsNull()) return aGEOMObject._retn(); //Create the Edge - Handle(GEOM_Object) anObject = GetOperations()->MakeEdgeWire(aWire, theLinearTolerance, theAngularTolerance); + Handle(::GEOM_Object) anObject = GetOperations()->MakeEdgeWire(aWire, theLinearTolerance, theAngularTolerance); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -163,18 +194,18 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeWire GetOperations()->SetNotDone(); int ind, aLen; - std::list aShapes; + std::list aShapes; //Get the shapes aLen = theEdgesAndWires.length(); for (ind = 0; ind < aLen; ind++) { - Handle(GEOM_Object) aSh = GetObjectImpl(theEdgesAndWires[ind]); + Handle(::GEOM_Object) aSh = GetObjectImpl(theEdgesAndWires[ind]); if (aSh.IsNull()) return aGEOMObject._retn(); aShapes.push_back(aSh); } // Make Solid - Handle(GEOM_Object) anObject = + Handle(::GEOM_Object) anObject = GetOperations()->MakeWire(aShapes, theTolerance); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -197,11 +228,11 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeFace GetOperations()->SetNotDone(); //Get the reference wire - Handle(GEOM_Object) aWire = GetObjectImpl(theWire); + Handle(::GEOM_Object) aWire = GetObjectImpl(theWire); if (aWire.IsNull()) return aGEOMObject._retn(); //Create the Face - Handle(GEOM_Object) anObject = GetOperations()->MakeFace(aWire, isPlanarWanted); + Handle(::GEOM_Object) anObject = GetOperations()->MakeFace(aWire, isPlanarWanted); //if (!GetOperations()->IsDone() || anObject.IsNull()) // enable warning status if (anObject.IsNull()) @@ -225,18 +256,18 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeFaceWires GetOperations()->SetNotDone(); int ind, aLen; - std::list aShapes; + std::list aShapes; //Get the shapes aLen = theWires.length(); for (ind = 0; ind < aLen; ind++) { - Handle(GEOM_Object) aSh = GetObjectImpl(theWires[ind]); + Handle(::GEOM_Object) aSh = GetObjectImpl(theWires[ind]); if (aSh.IsNull()) return aGEOMObject._retn(); aShapes.push_back(aSh); } // Make Face - Handle(GEOM_Object) anObject = + Handle(::GEOM_Object) anObject = GetOperations()->MakeFaceWires(aShapes, isPlanarWanted); //if (!GetOperations()->IsDone() || anObject.IsNull()) // enable warning status @@ -246,6 +277,70 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeFaceWires return GetObject(anObject); } +//============================================================================= +/*! + * MakeFaceFromSurface + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeFaceFromSurface + (GEOM::GEOM_Object_ptr theFace, + GEOM::GEOM_Object_ptr theWire) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference face and wire + Handle(::GEOM_Object) aFace = GetObjectImpl(theFace); + Handle(::GEOM_Object) aWire = GetObjectImpl(theWire); + + if (aFace.IsNull() || aWire.IsNull()) { + return aGEOMObject._retn(); + } + + //Create the Face + Handle(::GEOM_Object) anObject = + GetOperations()->MakeFaceFromSurface(aFace, aWire); + + if (anObject.IsNull()) { + return aGEOMObject._retn(); + } + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeFaceWithConstraints + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeFaceWithConstraints + (const GEOM::ListOfGO& theConstraints) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the shapes + std::list aConstraints; + for( CORBA::ULong ind = 0; ind < theConstraints.length(); ind++ ) { + Handle(::GEOM_Object) anObject = GetObjectImpl( theConstraints[ind] ); + aConstraints.push_back(anObject); + } + + // Make Face + Handle(::GEOM_Object) anObject = + GetOperations()->MakeFaceWithConstraints( aConstraints ); + + // enable warning status + if (anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * MakeShell @@ -260,18 +355,18 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeShell GetOperations()->SetNotDone(); int ind, aLen; - std::list aShapes; + std::list aShapes; //Get the shapes aLen = theFacesAndShells.length(); for (ind = 0; ind < aLen; ind++) { - Handle(GEOM_Object) aSh = GetObjectImpl(theFacesAndShells[ind]); + Handle(::GEOM_Object) aSh = GetObjectImpl(theFacesAndShells[ind]); if (aSh.IsNull()) return aGEOMObject._retn(); aShapes.push_back(aSh); } // Make Solid - Handle(GEOM_Object) anObject = + Handle(::GEOM_Object) anObject = GetOperations()->MakeShell(aShapes); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -293,14 +388,14 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeSolidShell GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShell = GetObjectImpl(theShell); + Handle(::GEOM_Object) aShell = GetObjectImpl(theShell); if (aShell.IsNull()) return aGEOMObject._retn(); - std::list aShapes; + std::list aShapes; aShapes.push_back(aShell); //Create the Solid - Handle(GEOM_Object) anObject = GetOperations()->MakeSolidShells(aShapes); + Handle(::GEOM_Object) anObject = GetOperations()->MakeSolidShells(aShapes); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -321,18 +416,18 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeSolidShells GetOperations()->SetNotDone(); int ind, aLen; - std::list aShapes; + std::list aShapes; //Get the shapes aLen = theShells.length(); for (ind = 0; ind < aLen; ind++) { - Handle(GEOM_Object) aSh = GetObjectImpl(theShells[ind]); + Handle(::GEOM_Object) aSh = GetObjectImpl(theShells[ind]); if (aSh.IsNull()) return aGEOMObject._retn(); aShapes.push_back(aSh); } // Make Solid - Handle(GEOM_Object) anObject = + Handle(::GEOM_Object) anObject = GetOperations()->MakeSolidShells(aShapes); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -345,8 +440,8 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeSolidShells * MakeCompound */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeCompound - (const GEOM::ListOfGO& theShapes) +GEOM::GEOM_Object_ptr +GEOM_IShapesOperations_i::MakeCompound (const GEOM::ListOfGO& theShapes) { GEOM::GEOM_Object_var aGEOMObject; @@ -354,18 +449,18 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeCompound GetOperations()->SetNotDone(); int ind, aLen; - std::list aShapes; + std::list aShapes; //Get the shapes aLen = theShapes.length(); for (ind = 0; ind < aLen; ind++) { - Handle(GEOM_Object) aSh = GetObjectImpl(theShapes[ind]); + Handle(::GEOM_Object) aSh = GetObjectImpl(theShapes[ind]); if (aSh.IsNull()) return aGEOMObject._retn(); aShapes.push_back(aSh); } // Make Solid - Handle(GEOM_Object) anObject = + Handle(::GEOM_Object) anObject = GetOperations()->MakeCompound(aShapes); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -373,15 +468,49 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeCompound return GetObject(anObject); } +//============================================================================= +/*! + * MakeSolidFromConnectedFaces + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeSolidFromConnectedFaces + (const GEOM::ListOfGO& theFacesOrShells, + const CORBA::Boolean isIntersect) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + int ind, aLen; + std::list aShapes; + + //Get the shapes + aLen = theFacesOrShells.length(); + for (ind = 0; ind < aLen; ind++) { + ::Handle(::GEOM_Object) aSh = GetObjectImpl(theFacesOrShells[ind]); + if (aSh.IsNull()) return aGEOMObject._retn(); + aShapes.push_back(aSh); + } + + // Make Solid + Handle(::GEOM_Object) anObject = + GetOperations()->MakeSolidFromConnectedFaces(aShapes, isIntersect); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * MakeGlueFaces */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueFaces - (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theTolerance, - CORBA::Boolean doKeepNonSolids) +GEOM::GEOM_Object_ptr +GEOM_IShapesOperations_i::MakeGlueFaces (const GEOM::ListOfGO& theShapes, + CORBA::Double theTolerance, + CORBA::Boolean doKeepNonSolids) { GEOM::GEOM_Object_var aGEOMObject; @@ -389,12 +518,13 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueFaces GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - if (aShape.IsNull()) return aGEOMObject._retn(); + std::list< Handle(::GEOM_Object) > aShapes; + if (! GetListOfObjectsImpl( theShapes, aShapes )) + return aGEOMObject._retn(); //Perform the gluing - Handle(GEOM_Object) anObject = - GetOperations()->MakeGlueFaces(aShape, theTolerance, doKeepNonSolids); + Handle(::GEOM_Object) anObject = + GetOperations()->MakeGlueFaces(aShapes, theTolerance, doKeepNonSolids); //if (!GetOperations()->IsDone() || anObject.IsNull()) // to allow warning if (anObject.IsNull()) @@ -408,9 +538,9 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueFaces * GetGlueFaces */ //============================================================================= -GEOM::ListOfGO* GEOM_IShapesOperations_i::GetGlueFaces - (GEOM::GEOM_Object_ptr theShape, - const CORBA::Double theTolerance) +GEOM::ListOfGO* +GEOM_IShapesOperations_i::GetGlueFaces (const GEOM::ListOfGO& theShapes, + const CORBA::Double theTolerance) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -418,12 +548,12 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetGlueFaces GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - if (aShape.IsNull()) return aSeq._retn(); + std::list< Handle(::GEOM_Object) > aShapes; + if (! GetListOfObjectsImpl( theShapes, aShapes )) + return aSeq._retn(); Handle(TColStd_HSequenceOfTransient) aHSeq = - //GetOperations()->GetGlueFaces(aShape, theTolerance); - GetOperations()->GetGlueShapes(aShape, theTolerance, TopAbs_FACE); + GetOperations()->GetGlueShapes(aShapes, theTolerance, TopAbs_FACE); //if (!GetOperations()->IsDone() || aHSeq.IsNull()) // to allow warning @@ -433,7 +563,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetGlueFaces Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -443,12 +573,12 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetGlueFaces * MakeGlueFacesByList */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueFacesByList - (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theTolerance, - const GEOM::ListOfGO& theFaces, - CORBA::Boolean doKeepNonSolids, - CORBA::Boolean doGlueAllEdges) +GEOM::GEOM_Object_ptr +GEOM_IShapesOperations_i::MakeGlueFacesByList (const GEOM::ListOfGO& theShapes, + CORBA::Double theTolerance, + const GEOM::ListOfGO& theFaces, + CORBA::Boolean doKeepNonSolids, + CORBA::Boolean doGlueAllEdges) { GEOM::GEOM_Object_var aGEOMObject; @@ -456,22 +586,19 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueFacesByList GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - if (aShape.IsNull()) return aGEOMObject._retn(); + std::list< Handle(::GEOM_Object) > aShapes; + if (! GetListOfObjectsImpl( theShapes, aShapes )) + return aGEOMObject._retn(); - int ind, aLen; - std::list aFaces; //Get the shapes - aLen = theFaces.length(); - for (ind = 0; ind < aLen; ind++) { - Handle(GEOM_Object) aSh = GetObjectImpl(theFaces[ind]); - if (aSh.IsNull()) return aGEOMObject._retn(); - aFaces.push_back(aSh); - } + std::list aFaces; + if (! GetListOfObjectsImpl( theFaces, aFaces )) + return aGEOMObject._retn(); //Perform the gluing - Handle(GEOM_Object) anObject = - GetOperations()->MakeGlueFacesByList(aShape, theTolerance, aFaces, doKeepNonSolids, doGlueAllEdges); + Handle(::GEOM_Object) anObject = + GetOperations()->MakeGlueFacesByList(aShapes, theTolerance, aFaces, + doKeepNonSolids, doGlueAllEdges); //if (!GetOperations()->IsDone() || anObject.IsNull()) // to allow warning if (anObject.IsNull()) @@ -485,9 +612,9 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueFacesByList * MakeGlueEdges */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueEdges - (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theTolerance) +GEOM::GEOM_Object_ptr +GEOM_IShapesOperations_i::MakeGlueEdges (const GEOM::ListOfGO& theShapes, + CORBA::Double theTolerance) { GEOM::GEOM_Object_var aGEOMObject; @@ -495,12 +622,13 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueEdges GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - if (aShape.IsNull()) return aGEOMObject._retn(); + std::list< Handle(::GEOM_Object) > aShapes; + if (! GetListOfObjectsImpl( theShapes, aShapes )) + return aGEOMObject._retn(); //Perform the gluing - Handle(GEOM_Object) anObject = - GetOperations()->MakeGlueEdges(aShape, theTolerance); + Handle(::GEOM_Object) anObject = + GetOperations()->MakeGlueEdges(aShapes, theTolerance); //if (!GetOperations()->IsDone() || anObject.IsNull()) // to allow warning if (anObject.IsNull()) @@ -514,9 +642,9 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueEdges * GetGlueEdges */ //============================================================================= -GEOM::ListOfGO* GEOM_IShapesOperations_i::GetGlueEdges - (GEOM::GEOM_Object_ptr theShape, - const CORBA::Double theTolerance) +GEOM::ListOfGO* +GEOM_IShapesOperations_i::GetGlueEdges (const GEOM::ListOfGO& theShapes, + const CORBA::Double theTolerance) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -524,11 +652,12 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetGlueEdges GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - if (aShape.IsNull()) return aSeq._retn(); + std::list< Handle(::GEOM_Object) > aShapes; + if (! GetListOfObjectsImpl( theShapes, aShapes )) + return aSeq._retn(); Handle(TColStd_HSequenceOfTransient) aHSeq = - GetOperations()->GetGlueShapes(aShape, theTolerance, TopAbs_EDGE); + GetOperations()->GetGlueShapes(aShapes, theTolerance, TopAbs_EDGE); //if (!GetOperations()->IsDone() || aHSeq.IsNull()) // to allow warning @@ -538,7 +667,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetGlueEdges Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -548,10 +677,10 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetGlueEdges * MakeGlueEdgesByList */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueEdgesByList - (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theTolerance, - const GEOM::ListOfGO& theEdges) +GEOM::GEOM_Object_ptr +GEOM_IShapesOperations_i::MakeGlueEdgesByList (const GEOM::ListOfGO& theShapes, + CORBA::Double theTolerance, + const GEOM::ListOfGO& theEdges) { GEOM::GEOM_Object_var aGEOMObject; @@ -559,22 +688,18 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueEdgesByList GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - if (aShape.IsNull()) return aGEOMObject._retn(); + std::list< Handle(::GEOM_Object) > aShapes; + if (! GetListOfObjectsImpl( theShapes, aShapes )) + return aGEOMObject._retn(); - int ind, aLen; - std::list anEdges; //Get the shapes - aLen = theEdges.length(); - for (ind = 0; ind < aLen; ind++) { - Handle(GEOM_Object) aSh = GetObjectImpl(theEdges[ind]); - if (aSh.IsNull()) return aGEOMObject._retn(); - anEdges.push_back(aSh); - } + std::list anEdges; + if (! GetListOfObjectsImpl( theEdges, anEdges )) + return aGEOMObject._retn(); //Perform the gluing - Handle(GEOM_Object) anObject = - GetOperations()->MakeGlueEdgesByList(aShape, theTolerance, anEdges); + Handle(::GEOM_Object) anObject = + GetOperations()->MakeGlueEdgesByList(aShapes, theTolerance, anEdges); //if (!GetOperations()->IsDone() || anObject.IsNull()) // to allow warning if (anObject.IsNull()) @@ -588,23 +713,24 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueEdgesByList * GetExistingSubObjects */ //============================================================================= -GEOM::ListOfGO* GEOM_IShapesOperations_i::GetExistingSubObjects (GEOM::GEOM_Object_ptr theShape, - CORBA::Boolean theGroupsOnly) +GEOM::ListOfGO* +GEOM_IShapesOperations_i::GetExistingSubObjects (GEOM::GEOM_Object_ptr theShape, + CORBA::Boolean theGroupsOnly) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); if (aShape.IsNull()) return aSeq._retn(); Handle(TColStd_HSequenceOfTransient) aHSeq = - GetOperations()->GetExistingSubObjects(aShape, theGroupsOnly); + GetOperations()->GetExistingSubObjects(aShape, (Standard_Boolean)theGroupsOnly); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -620,7 +746,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::MakeExplode (GEOM::GEOM_Object_ptr the { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); if (aShape.IsNull()) return aSeq._retn(); Handle(TColStd_HSequenceOfTransient) aHSeq = @@ -632,7 +758,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::MakeExplode (GEOM::GEOM_Object_ptr the Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -648,7 +774,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::MakeAllSubShapes (GEOM::GEOM_Object_pt { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); if (aShape.IsNull()) return aSeq._retn(); Handle(TColStd_HSequenceOfTransient) aHSeq = @@ -660,7 +786,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::MakeAllSubShapes (GEOM::GEOM_Object_pt Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -676,7 +802,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::ExtractSubShapes (GEOM::GEOM_Object_pt { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); if (aShape.IsNull()) return aSeq._retn(); Handle(TColStd_HSequenceOfTransient) aHSeq = @@ -689,7 +815,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::ExtractSubShapes (GEOM::GEOM_Object_pt Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -705,7 +831,7 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::SubShapeAllIDs (GEOM::GEOM_Object_pt { GEOM::ListOfLong_var aSeq = new GEOM::ListOfLong; - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); if (aShape.IsNull()) return aSeq._retn(); Handle(TColStd_HSequenceOfInteger) aHSeq = @@ -732,7 +858,7 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetAllSubShapesIDs (GEOM::GEOM_Objec { GEOM::ListOfLong_var aSeq = new GEOM::ListOfLong; - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); if (aShape.IsNull()) return aSeq._retn(); Handle(TColStd_HSequenceOfInteger) aHSeq = @@ -763,10 +889,10 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::GetSubShape GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theMainShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theMainShape); if (aShape.IsNull()) return aGEOMObject._retn(); - Handle(GEOM_Object) anObject = GetOperations()->GetSubShape(aShape, theID); + Handle(::GEOM_Object) anObject = GetOperations()->GetSubShape(aShape, theID); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -782,7 +908,6 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::MakeSubShapes (GEOM::GEOM_Object_ptr t const GEOM::ListOfLong& theIndices) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; - Standard_Integer i; //Set a not done flag GetOperations()->SetNotDone(); @@ -790,11 +915,11 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::MakeSubShapes (GEOM::GEOM_Object_ptr t if (theIndices.length() < 1) return aSeq._retn(); - Handle(GEOM_Object) aShape = GetObjectImpl(theMainShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theMainShape); if (aShape.IsNull()) return aSeq._retn(); Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger (1, theIndices.length()); - for (i = 0; i < theIndices.length(); i++) + for (CORBA::ULong i = 0; i < theIndices.length(); i++) anArray->SetValue(i+1, theIndices[i]); Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->MakeSubShapes(aShape, anArray); @@ -803,8 +928,8 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::MakeSubShapes (GEOM::GEOM_Object_ptr t Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); - for (i = 0; i < aLength; i++) - aSeq[i] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i+1))); + for (int i = 0; i < aLength; i++) + aSeq[i] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i+1))); return aSeq._retn(); } @@ -818,8 +943,8 @@ CORBA::Long GEOM_IShapesOperations_i::GetSubShapeIndex (GEOM::GEOM_Object_ptr theMainShape, GEOM::GEOM_Object_ptr theSubShape) { //Get the reference shapes - Handle(GEOM_Object) aMainShapeRef = GetObjectImpl(theMainShape); - Handle(GEOM_Object) aSubShapeRef = GetObjectImpl(theSubShape); + Handle(::GEOM_Object) aMainShapeRef = GetObjectImpl(theMainShape); + Handle(::GEOM_Object) aSubShapeRef = GetObjectImpl(theSubShape); if (aMainShapeRef.IsNull() || aSubShapeRef.IsNull()) return -1; @@ -842,14 +967,14 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetSubShapesIndices GEOM::ListOfLong_var aSeq = new GEOM::ListOfLong; //Get the reference main shape - Handle(GEOM_Object) aMainShapeRef = GetObjectImpl(theMainShape); + Handle(::GEOM_Object) aMainShapeRef = GetObjectImpl(theMainShape); if (aMainShapeRef.IsNull()) return aSeq._retn(); //Get the subshapes - std::list aShapes; + std::list aShapes; int aLen = theSubShapes.length(); for (int ind = 0; ind < aLen; ind++) { - Handle(GEOM_Object) aSh = GetObjectImpl(theSubShapes[ind]); + Handle(::GEOM_Object) aSh = GetObjectImpl(theSubShapes[ind]); if (aSh.IsNull()) { MESSAGE("NULL shape") @@ -883,8 +1008,8 @@ CORBA::Long GEOM_IShapesOperations_i::GetTopologyIndex (GEOM::GEOM_Object_ptr theMainShape, GEOM::GEOM_Object_ptr theSubShape) { //Get the reference shapes - Handle(GEOM_Object) aMainShapeRef = GetObjectImpl(theMainShape); - Handle(GEOM_Object) aSubShapeRef = GetObjectImpl(theSubShape); + Handle(::GEOM_Object) aMainShapeRef = GetObjectImpl(theMainShape); + Handle(::GEOM_Object) aSubShapeRef = GetObjectImpl(theSubShape); if (aMainShapeRef.IsNull() || aSubShapeRef.IsNull()) return -1; @@ -904,7 +1029,7 @@ CORBA::Long GEOM_IShapesOperations_i::GetTopologyIndex char* GEOM_IShapesOperations_i::GetShapeTypeString (GEOM::GEOM_Object_ptr theShape) { //Get the reference shape - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); if (aShape.IsNull()) return NULL; // Get shape parameters @@ -912,6 +1037,25 @@ char* GEOM_IShapesOperations_i::GetShapeTypeString (GEOM::GEOM_Object_ptr theSha return CORBA::string_dup(aDescription.ToCString()); } +//============================================================================= +/*! + * IsSubShapeBelongsTo + */ +//============================================================================= +CORBA::Boolean GEOM_IShapesOperations_i::IsSubShapeBelongsTo( GEOM::GEOM_Object_ptr theSubObject, + const CORBA::Long theSubObjectIndex, + GEOM::GEOM_Object_ptr theObject, + const CORBA::Long theObjectIndex) +{ + Handle(::GEOM_Object) aSubObject = GetObjectImpl( theSubObject ); + Handle(::GEOM_Object) anObject = GetObjectImpl( theObject ); + if( anObject.IsNull() || aSubObject.IsNull() ) + return false; + + // Get parameters + return GetOperations()->IsSubShapeBelongsTo( aSubObject, theSubObjectIndex, anObject, theObjectIndex ); +} + //============================================================================= /*! * NumberOfFaces @@ -940,7 +1084,7 @@ CORBA::Long GEOM_IShapesOperations_i::NumberOfEdges (GEOM::GEOM_Object_ptr theSh CORBA::Long GEOM_IShapesOperations_i::NumberOfSubShapes (GEOM::GEOM_Object_ptr theShape, const CORBA::Long theShapeType) { - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); if (aShape.IsNull()) return -1; CORBA::Long aNb = GetOperations()->NumberOfSubShapes(aShape, theShapeType); @@ -963,11 +1107,11 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::ChangeOrientation GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); if (aShape.IsNull()) return aGEOMObject._retn(); //Create the Solid - Handle(GEOM_Object) anObject = GetOperations()->ReverseShape(aShape); + Handle(::GEOM_Object) anObject = GetOperations()->ReverseShape(aShape); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -986,7 +1130,7 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetFreeFacesIDs (GEOM::GEOM_Object_p GEOM::ListOfLong_var aSeq = new GEOM::ListOfLong; - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); if (aShape.IsNull()) return aSeq._retn(); Handle(TColStd_HSequenceOfInteger) aHSeq = @@ -1016,8 +1160,8 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetSharedShapes GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; - Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1); - Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2); + Handle(::GEOM_Object) aShape1 = GetObjectImpl(theShape1); + Handle(::GEOM_Object) aShape2 = GetObjectImpl(theShape2); if (aShape1.IsNull() || aShape2.IsNull()) return aSeq._retn(); @@ -1029,7 +1173,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetSharedShapes Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -1041,7 +1185,8 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetSharedShapes //============================================================================= GEOM::ListOfGO* GEOM_IShapesOperations_i::GetSharedShapesMulti (const GEOM::ListOfGO& theShapes, - const CORBA::Long theShapeType) + const CORBA::Long theShapeType, + CORBA::Boolean theMultiShare) { //Set a not done flag GetOperations()->SetNotDone(); @@ -1049,23 +1194,19 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetSharedShapesMulti GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; //Get the shapes - std::list aShapes; - int aLen = theShapes.length(); - for (int ind = 0; ind < aLen; ind++) { - Handle(GEOM_Object) aSh = GetObjectImpl(theShapes[ind]); - if (aSh.IsNull()) return aSeq._retn(); - aShapes.push_back(aSh); - } + std::list aShapes; + if (! GetListOfObjectsImpl( theShapes, aShapes )) + return aSeq._retn(); Handle(TColStd_HSequenceOfTransient) aHSeq = - GetOperations()->GetSharedShapes(aShapes, theShapeType); + GetOperations()->GetSharedShapes(aShapes, theShapeType, theMultiShare); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -1114,8 +1255,8 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnPlane GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) anAx1 = GetObjectImpl(theAx1); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) anAx1 = GetObjectImpl(theAx1); if (aShape.IsNull() || anAx1.IsNull()) return aSeq._retn(); @@ -1128,7 +1269,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnPlane Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -1151,9 +1292,9 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnPlaneWithLocation GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) anAx1 = GetObjectImpl(theAx1); - Handle(GEOM_Object) anPnt = GetObjectImpl(thePnt); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) anAx1 = GetObjectImpl(theAx1); + Handle(::GEOM_Object) anPnt = GetObjectImpl(thePnt); if (aShape.IsNull() || anAx1.IsNull() || anPnt.IsNull()) return aSeq._retn(); @@ -1166,7 +1307,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnPlaneWithLocation Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -1189,8 +1330,8 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnCylinder GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) anAxis = GetObjectImpl(theAxis); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) anAxis = GetObjectImpl(theAxis); if (aShape.IsNull() || anAxis.IsNull()) return aSeq._retn(); @@ -1203,7 +1344,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnCylinder Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -1227,9 +1368,9 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnCylinderWithLocation GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) anAxis = GetObjectImpl(theAxis); - Handle(GEOM_Object) aPnt = GetObjectImpl(thePnt); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) anAxis = GetObjectImpl(theAxis); + Handle(::GEOM_Object) aPnt = GetObjectImpl(thePnt); if (aShape.IsNull() || anAxis.IsNull() || aPnt.IsNull()) return aSeq._retn(); @@ -1242,7 +1383,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnCylinderWithLocation Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -1265,8 +1406,8 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnSphere GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) aCenter = GetObjectImpl(theCenter); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aCenter = GetObjectImpl(theCenter); if (aShape.IsNull() || aCenter.IsNull()) return aSeq._retn(); @@ -1279,7 +1420,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnSphere Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -1293,9 +1434,9 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnQuadrangle (GEOM::GEOM_Object_ptr theShape, CORBA::Long theShapeType, GEOM::GEOM_Object_ptr theTopLeftPoint, - GEOM::GEOM_Object_ptr theTopRigthPoint, + GEOM::GEOM_Object_ptr theTopRightPoint, GEOM::GEOM_Object_ptr theBottomLeftPoint, - GEOM::GEOM_Object_ptr theBottomRigthPoint, + GEOM::GEOM_Object_ptr theBottomRightPoint, GEOM::shape_state theState) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -1304,23 +1445,23 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnQuadrangle GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) aTopLeftPoint = GetObjectImpl(theTopLeftPoint); - Handle(GEOM_Object) aTopRigthPoint = GetObjectImpl(theTopRigthPoint); - Handle(GEOM_Object) aBottomLeftPoint = GetObjectImpl(theBottomLeftPoint); - Handle(GEOM_Object) aBottomRigthPoint = GetObjectImpl(theBottomRigthPoint); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aTopLeftPoint = GetObjectImpl(theTopLeftPoint); + Handle(::GEOM_Object) aTopRightPoint = GetObjectImpl(theTopRightPoint); + Handle(::GEOM_Object) aBottomLeftPoint = GetObjectImpl(theBottomLeftPoint); + Handle(::GEOM_Object) aBottomRightPoint = GetObjectImpl(theBottomRightPoint); if (aShape.IsNull() || aTopLeftPoint.IsNull() || - aTopRigthPoint.IsNull() || + aTopRightPoint.IsNull() || aBottomLeftPoint.IsNull() || - aBottomRigthPoint.IsNull()) + aBottomRightPoint.IsNull()) return aSeq._retn(); //Get Shapes On Quadrangle Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->GetShapesOnQuadrangle (aShape, theShapeType, - aTopLeftPoint, aTopRigthPoint, aBottomLeftPoint, aBottomRigthPoint, + aTopLeftPoint, aTopRightPoint, aBottomLeftPoint, aBottomRightPoint, ShapeState(theState)); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); @@ -1328,7 +1469,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnQuadrangle Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -1350,8 +1491,8 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetShapesOnPlaneIDs GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) anAx1 = GetObjectImpl(theAx1); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) anAx1 = GetObjectImpl(theAx1); if (aShape.IsNull() || anAx1.IsNull()) return aSeq._retn(); @@ -1387,9 +1528,9 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetShapesOnPlaneWithLocationIDs GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) anAx1 = GetObjectImpl(theAx1); - Handle(GEOM_Object) anPnt = GetObjectImpl(thePnt); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) anAx1 = GetObjectImpl(theAx1); + Handle(::GEOM_Object) anPnt = GetObjectImpl(thePnt); if (aShape.IsNull() || anAx1.IsNull() || anPnt.IsNull()) return aSeq._retn(); @@ -1426,8 +1567,8 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetShapesOnCylinderIDs GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) anAxis = GetObjectImpl(theAxis); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) anAxis = GetObjectImpl(theAxis); if (aShape.IsNull() || anAxis.IsNull()) return aSeq._retn(); @@ -1464,9 +1605,9 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetShapesOnCylinderWithLocationIDs GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) anAxis = GetObjectImpl(theAxis); - Handle(GEOM_Object) aPnt = GetObjectImpl(thePnt); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) anAxis = GetObjectImpl(theAxis); + Handle(::GEOM_Object) aPnt = GetObjectImpl(thePnt); if (aShape.IsNull() || anAxis.IsNull() || aPnt.IsNull()) return aSeq._retn(); @@ -1502,8 +1643,8 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetShapesOnSphereIDs GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) aCenter = GetObjectImpl(theCenter); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aCenter = GetObjectImpl(theCenter); if (aShape.IsNull() || aCenter.IsNull()) return aSeq._retn(); @@ -1530,9 +1671,9 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetShapesOnQuadrangleIDs (GEOM::GEOM_Object_ptr theShape, CORBA::Long theShapeType, GEOM::GEOM_Object_ptr theTopLeftPoint, - GEOM::GEOM_Object_ptr theTopRigthPoint, + GEOM::GEOM_Object_ptr theTopRightPoint, GEOM::GEOM_Object_ptr theBottomLeftPoint, - GEOM::GEOM_Object_ptr theBottomRigthPoint, + GEOM::GEOM_Object_ptr theBottomRightPoint, GEOM::shape_state theState) { GEOM::ListOfLong_var aSeq = new GEOM::ListOfLong; @@ -1541,23 +1682,23 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetShapesOnQuadrangleIDs GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) aTopLeftPoint = GetObjectImpl(theTopLeftPoint); - Handle(GEOM_Object) aTopRigthPoint = GetObjectImpl(theTopRigthPoint); - Handle(GEOM_Object) aBottomLeftPoint = GetObjectImpl(theBottomLeftPoint); - Handle(GEOM_Object) aBottomRigthPoint = GetObjectImpl(theBottomRigthPoint); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aTopLeftPoint = GetObjectImpl(theTopLeftPoint); + Handle(::GEOM_Object) aTopRightPoint = GetObjectImpl(theTopRightPoint); + Handle(::GEOM_Object) aBottomLeftPoint = GetObjectImpl(theBottomLeftPoint); + Handle(::GEOM_Object) aBottomRightPoint = GetObjectImpl(theBottomRightPoint); if (aShape.IsNull() || aTopLeftPoint.IsNull() || - aTopRigthPoint.IsNull() || + aTopRightPoint.IsNull() || aBottomLeftPoint.IsNull() || - aBottomRigthPoint.IsNull() ) + aBottomRightPoint.IsNull() ) return aSeq._retn(); //Get Shapes On Quadrangle Handle(TColStd_HSequenceOfInteger) aHSeq = GetOperations()->GetShapesOnQuadrangleIDs (aShape, theShapeType, - aTopLeftPoint, aTopRigthPoint, aBottomLeftPoint, aBottomRigthPoint, + aTopLeftPoint, aTopRightPoint, aBottomLeftPoint, aBottomRightPoint, ShapeState(theState)); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); @@ -1587,8 +1728,8 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnBox GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) aBox = GetObjectImpl(theBox); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aBox = GetObjectImpl(theBox); if (aShape.IsNull() || aBox.IsNull() ) return aSeq._retn(); @@ -1602,7 +1743,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnBox Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -1624,8 +1765,8 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetShapesOnBoxIDs GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) aBox = GetObjectImpl(theBox); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aBox = GetObjectImpl(theBox); if (aShape.IsNull() || aBox.IsNull() ) return aSeq._retn(); @@ -1662,8 +1803,8 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnShape GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) aCheckShape = GetObjectImpl(theCheckShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aCheckShape = GetObjectImpl(theCheckShape); if (aShape.IsNull() || aCheckShape.IsNull() ) return aSeq._retn(); @@ -1678,7 +1819,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnShape Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) - aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); return aSeq._retn(); } @@ -1701,14 +1842,14 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::GetShapesOnShapeAsCompound GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) aCheckShape = GetObjectImpl(theCheckShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aCheckShape = GetObjectImpl(theCheckShape); if (aShape.IsNull() || aCheckShape.IsNull() ) return aGEOMObject._retn(); //Get Shapes On Shape - Handle(GEOM_Object) anObject = GetOperations()->GetShapesOnShapeAsCompound + Handle(::GEOM_Object) anObject = GetOperations()->GetShapesOnShapeAsCompound (aCheckShape,aShape, theShapeType,ShapeState(theState)); if (anObject.IsNull()) @@ -1735,8 +1876,8 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetShapesOnShapeIDs GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - Handle(GEOM_Object) aCheckShape = GetObjectImpl(theCheckShape); + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aCheckShape = GetObjectImpl(theCheckShape); if (aShape.IsNull() || aCheckShape.IsNull() ) return aSeq._retn(); @@ -1771,14 +1912,14 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::GetInPlace GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShapeWhere = GetObjectImpl(theShapeWhere); - Handle(GEOM_Object) aShapeWhat = GetObjectImpl(theShapeWhat); + Handle(::GEOM_Object) aShapeWhere = GetObjectImpl(theShapeWhere); + Handle(::GEOM_Object) aShapeWhat = GetObjectImpl(theShapeWhat); if (aShapeWhere.IsNull() || aShapeWhat.IsNull()) return aGEOMObject._retn(); //Get Shapes in place of aShapeWhat - Handle(GEOM_Object) anObject = + Handle(::GEOM_Object) anObject = GetOperations()->GetInPlace(aShapeWhere, aShapeWhat); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -1801,14 +1942,14 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::GetInPlaceOld GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShapeWhere = GetObjectImpl(theShapeWhere); - Handle(GEOM_Object) aShapeWhat = GetObjectImpl(theShapeWhat); + Handle(::GEOM_Object) aShapeWhere = GetObjectImpl(theShapeWhere); + Handle(::GEOM_Object) aShapeWhat = GetObjectImpl(theShapeWhat); if (aShapeWhere.IsNull() || aShapeWhat.IsNull()) return aGEOMObject._retn(); //Get Shapes in place of aShapeWhat - Handle(GEOM_Object) anObject = + Handle(::GEOM_Object) anObject = GetOperations()->GetInPlaceOld(aShapeWhere, aShapeWhat); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -1831,14 +1972,14 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::GetInPlaceByHistory GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShapeWhere = GetObjectImpl(theShapeWhere); - Handle(GEOM_Object) aShapeWhat = GetObjectImpl(theShapeWhat); + Handle(::GEOM_Object) aShapeWhere = GetObjectImpl(theShapeWhere); + Handle(::GEOM_Object) aShapeWhat = GetObjectImpl(theShapeWhat); if (aShapeWhere.IsNull() || aShapeWhat.IsNull()) return aGEOMObject._retn(); //Get Shapes in place of aShapeWhat - Handle(GEOM_Object) anObject = + Handle(::GEOM_Object) anObject = GetOperations()->GetInPlaceByHistory(aShapeWhere, aShapeWhat); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -1846,6 +1987,39 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::GetInPlaceByHistory return GetObject(anObject); } +//============================================================================= +/*! + * GetInPlaceMap + */ +//============================================================================= +GEOM::ListOfListOfLong* +GEOM_IShapesOperations_i::GetInPlaceMap (GEOM::GEOM_Object_ptr theShapeWhere, + GEOM::GEOM_Object_ptr theShapeWhat) +{ + GEOM::ListOfListOfLong_var aResult = new GEOM::ListOfListOfLong(); + + //Get the reference objects + Handle(::GEOM_Object) aShapeWhere = GetObjectImpl(theShapeWhere); + Handle(::GEOM_Object) aShapeWhat = GetObjectImpl(theShapeWhat); + + if (!aShapeWhere.IsNull() && + !aShapeWhat.IsNull()) + { + std::vector< std::vector< int > > resVec; + GetOperations()->GetInPlaceMap(aShapeWhere, aShapeWhat, resVec); + + aResult->length( resVec.size() ); + for ( size_t i = 0; i < resVec.size(); ++i ) + { + //if ( !resVec[i].empty() ) + aResult[i].length( resVec[i].size() ); + for ( size_t j = 0; j < resVec[i].size(); ++j ) + aResult[i][j] = resVec[i][j]; + } + } + return aResult._retn(); +} + //============================================================================= /*! * GetSame @@ -1861,14 +2035,14 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::GetSame GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShapeWhere = GetObjectImpl(theShapeWhere); - Handle(GEOM_Object) aShapeWhat = GetObjectImpl(theShapeWhat); + Handle(::GEOM_Object) aShapeWhere = GetObjectImpl(theShapeWhere); + Handle(::GEOM_Object) aShapeWhat = GetObjectImpl(theShapeWhat); if (aShapeWhere.IsNull() || aShapeWhat.IsNull()) return aGEOMObject._retn(); //Get Shapes in place of aShapeWhat - Handle(GEOM_Object) anObject = + Handle(::GEOM_Object) anObject = GetOperations()->GetSame(aShapeWhere, aShapeWhat); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -1887,8 +2061,8 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetSameIDs GEOM::ListOfLong_var aSeq = new GEOM::ListOfLong; //Get the reference objects - Handle(GEOM_Object) aShapeWhere = GetObjectImpl(theShapeWhere); - Handle(GEOM_Object) aShapeWhat = GetObjectImpl(theShapeWhat); + Handle(::GEOM_Object) aShapeWhere = GetObjectImpl(theShapeWhere); + Handle(::GEOM_Object) aShapeWhat = GetObjectImpl(theShapeWhat); if (aShapeWhere.IsNull() || aShapeWhat.IsNull()) return aSeq._retn(); @@ -1906,3 +2080,282 @@ GEOM::ListOfLong* GEOM_IShapesOperations_i::GetSameIDs return aSeq._retn(); } + +//============================================================================= +/*! + * ExtendEdge + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::ExtendEdge + (GEOM::GEOM_Object_ptr theEdge, + CORBA::Double theMin, + CORBA::Double theMax) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference objects + Handle(::GEOM_Object) anEdge = GetObjectImpl(theEdge); + + if (anEdge.IsNull()) { + return aGEOMObject._retn(); + } + + //Get Shapes in place of aShapeWhat + Handle(::GEOM_Object) aNewEdge = + GetOperations()->ExtendEdge(anEdge, theMin, theMax); + + if (!GetOperations()->IsDone() || aNewEdge.IsNull()) { + return aGEOMObject._retn(); + } + + return GetObject(aNewEdge); +} + +//============================================================================= +/*! + * ExtendFace + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::ExtendFace + (GEOM::GEOM_Object_ptr theFace, + CORBA::Double theUMin, + CORBA::Double theUMax, + CORBA::Double theVMin, + CORBA::Double theVMax) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference objects + Handle(::GEOM_Object) aFace = GetObjectImpl(theFace); + + if (aFace.IsNull()) { + return aGEOMObject._retn(); + } + + //Get Shapes in place of aShapeWhat + Handle(::GEOM_Object) aNewFace = + GetOperations()->ExtendFace(aFace, theUMin, theUMax, theVMin, theVMax); + + if (!GetOperations()->IsDone() || aNewFace.IsNull()) { + return aGEOMObject._retn(); + } + + return GetObject(aNewFace); +} + +//============================================================================= +/*! + * MakeSurfaceFromFace + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeSurfaceFromFace + (GEOM::GEOM_Object_ptr theFace) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference object + Handle(::GEOM_Object) aFace = GetObjectImpl(theFace); + + if (aFace.IsNull()) { + return aGEOMObject._retn(); + } + + //Get Shapes in place of aShapeWhat + Handle(::GEOM_Object) aNewFace = GetOperations()->MakeSurfaceFromFace(aFace); + + if (!GetOperations()->IsDone() || aNewFace.IsNull()) { + return aGEOMObject._retn(); + } + + return GetObject(aNewFace); +} + +//============================================================================= +/*! + * GetSubShapeEdgeSorted + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IShapesOperations_i::GetSubShapeEdgeSorted + (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr theStartPoint) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference objects + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + Handle(::GEOM_Object) aStartPoint = GetObjectImpl(theStartPoint); + + if (aShape.IsNull() || aStartPoint.IsNull()) { + return aSeq._retn(); + } + + //Get Shapes On Shape + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->GetSubShapeEdgeSorted(aShape, aStartPoint); + + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + const Standard_Integer aLength = aHSeq->Length(); + Standard_Integer i; + + aSeq->length(aLength); + + for (i = 1; i <= aLength; i++) { + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); + } + + return aSeq._retn(); +} + +//============================================================================= +/*! + * GetSubShapesWithTolerance + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IShapesOperations_i::GetSubShapesWithTolerance + (GEOM::GEOM_Object_ptr theShape, + CORBA::Short theShapeType, + GEOM::comparison_condition theCondition, + CORBA::Double theTolerance) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference objects + Handle(::GEOM_Object) aShape = GetObjectImpl(theShape); + + if (aShape.IsNull()) { + return aSeq._retn(); + } + + //Get Shapes On Shape + const GEOMUtils::ComparisonCondition aCondition = + ComparisonCondition(theCondition); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->GetSubShapesWithTolerance + (aShape, theShapeType, aCondition, theTolerance); + + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + const Standard_Integer aLength = aHSeq->Length(); + Standard_Integer i; + + aSeq->length(aLength); + + for (i = 1; i <= aLength; i++) { + aSeq[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aHSeq->Value(i))); + } + + return aSeq._retn(); +} + +//============================================================================= +/*! + * MakeExtraction + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeExtraction + (GEOM::GEOM_Object_ptr theShape, + const GEOM::ListOfLong &theSubShapeIDs, + GEOM::GEOM_IShapesOperations::ExtractionStats_out theStats) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + theStats = new GEOM::GEOM_IShapesOperations::ExtractionStats; + GetOperations()->SetNotDone(); + + //Get the reference object + Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + + if (aShape.IsNull()) { + return aGEOMObject._retn(); + } + + const int aNbIDs = theSubShapeIDs.length(); + + if (aNbIDs == 0) { + return aGEOMObject._retn(); + } + + int i; + Handle(TColStd_HArray1OfInteger) anArray = + new TColStd_HArray1OfInteger (1, aNbIDs); + + for (i = 0; i < aNbIDs; i++) { + anArray->SetValue(i + 1, theSubShapeIDs[i]); + } + + //Get Shapes in place of aShapeWhat + std::list aStats; + Handle(GEOM_Object) aResult = + GetOperations()->MakeExtraction(aShape, anArray, aStats); + + if (!GetOperations()->IsDone() || aResult.IsNull()) { + return aGEOMObject._retn(); + } + + // Convert statistics. + const int aNbStats = aStats.size(); + + theStats->length(aNbStats); + + // fill the local CORBA array with values from lists + std::list::const_iterator + anIt = aStats.begin(); + + for (i = 0; anIt != aStats.end(); i++, anIt++) { + GEOM::GEOM_IShapesOperations::ExtractionStat_var aResStat = + new GEOM::GEOM_IShapesOperations::ExtractionStat; + + // Copy type + switch (anIt->type) { + case GEOMImpl_IShapesOperations::EST_Removed: + aResStat->type = GEOM::GEOM_IShapesOperations::EST_Removed; + break; + case GEOMImpl_IShapesOperations::EST_Modified: + aResStat->type = GEOM::GEOM_IShapesOperations::EST_Modified; + break; + case GEOMImpl_IShapesOperations::EST_Added: + aResStat->type = GEOM::GEOM_IShapesOperations::EST_Added; + break; + default: + break; + } + + // Copy the list of IDs + std::list aIDList = anIt->indices; + GEOM::ListOfLong_var aResIDList = new GEOM::ListOfLong; + + aResIDList->length(aIDList.size()); + + std::list::iterator anIDIt = aIDList.begin(); + int j = 0; + + for (; anIDIt != aIDList.end(); j++, anIDIt++) { + aResIDList[j] = *anIDIt; + } + + aResStat->indices = aResIDList; + + theStats[(_CORBA_ULong)i] = aResStat; + } + + return GetObject(aResult); +}