X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOM_I%2FGEOM_IHealingOperations_i.cc;h=af7cb5cd4be92d00fff4e67b6fc3960db452f426;hb=50dba628d88fa6cf56d507247f289db5ed4fc07e;hp=2190a7eb205e89d47931bc412ddfdc8e1b66ff12;hpb=dc8466f4ed277f900171b2b7c39fd63a8433c63f;p=modules%2Fgeom.git diff --git a/src/GEOM_I/GEOM_IHealingOperations_i.cc b/src/GEOM_I/GEOM_IHealingOperations_i.cc index 2190a7eb2..af7cb5cd4 100644 --- a/src/GEOM_I/GEOM_IHealingOperations_i.cc +++ b/src/GEOM_I/GEOM_IHealingOperations_i.cc @@ -1,5 +1,28 @@ +// Copyright (C) 2007-2014 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 +// 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, 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 +// 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 +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include + #include -using namespace std; #include "GEOM_IHealingOperations_i.hh" #include "GEOM_Engine.hxx" @@ -8,6 +31,7 @@ using namespace std; #include "utilities.h" #include "OpUtil.hxx" #include "Utils_ExceptHandlers.hxx" +#include #include @@ -18,8 +42,8 @@ using namespace std; //============================================================================= GEOM_IHealingOperations_i::GEOM_IHealingOperations_i (PortableServer::POA_ptr thePOA, - GEOM::GEOM_Gen_ptr theEngine, - ::GEOMImpl_IHealingOperations* theImpl) + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IHealingOperations* theImpl) :GEOM_IOperations_i(thePOA, theEngine, theImpl) { MESSAGE("GEOM_IHealingOperations_i::GEOM_IHealingOperations_i"); @@ -67,12 +91,9 @@ Handle(TColStd_HArray1OfExtendedString) GEOM_IHealingOperations_i::Convert if ( n <= 0 ) return anOutArray; anOutArray = new TColStd_HArray1OfExtendedString( 1, n ); - char* str; for ( int i = 0; i < n; i++ ) - { - str = CORBA::string_dup( theInArray[i] ); - anOutArray->SetValue( i+1, TCollection_ExtendedString( str ) ); - } + anOutArray->SetValue( i+1, TCollection_ExtendedString( theInArray[i].in() ) ); + return anOutArray; } @@ -82,27 +103,24 @@ Handle(TColStd_HArray1OfExtendedString) GEOM_IHealingOperations_i::Convert */ //============================================================================= GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::ProcessShape (GEOM::GEOM_Object_ptr theObject, - const GEOM::string_array& theOperations, - const GEOM::string_array& theParams, - const GEOM::string_array& theValues) + const GEOM::string_array& theOperations, + const GEOM::string_array& theParams, + const GEOM::string_array& theValues) { + Kernel_Utils::Localizer loc; + GEOM::GEOM_Object_var aGEOMObject; // Set a not done flag GetOperations()->SetNotDone(); - // Check parameters - if ( CORBA::is_nil(theObject) ) - return aGEOMObject._retn(); - // Check if theOperations has more than 0 elements and theParams and theValues have the same length -// if ( theOperations.length() <= 0 || theParams.length() != theValues.length() ) -// return aGEOMObject._retn(); + //if (theOperations.length() <= 0 || theParams.length() != theValues.length()) + // return aGEOMObject._retn(); // Get the object itself - Handle(GEOM_Object) anObject = - GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); - if ( anObject.IsNull() ) + Handle(GEOM_Object) anObject = GetObjectImpl(theObject); + if (anObject.IsNull()) return aGEOMObject._retn(); // Perform @@ -128,7 +146,7 @@ void GEOM_IHealingOperations_i::GetShapeProcessParameters(GEOM::string_array_out GEOM::string_array_var aValArray = new GEOM::string_array(); // retrieve the values as stl-lists - list operationsList, paramsList, valuesList; + std::list operationsList, paramsList, valuesList; GetOperations()->GetShapeProcessParameters( operationsList, paramsList, valuesList ); const int opSize = operationsList.size(), parSize = paramsList.size(), @@ -141,13 +159,13 @@ void GEOM_IHealingOperations_i::GetShapeProcessParameters(GEOM::string_array_out aValArray->length(valSize); // fill the local CORBA arrays with values from lists - list::iterator opIt, parIt, valIt; + std::list::iterator opIt, parIt, valIt; int i = 0; for ( opIt = operationsList.begin(); opIt != operationsList.end(); i++,++opIt ) anOpArray[i] = CORBA::string_dup( (*opIt).c_str() ); for ( i = 0, parIt = paramsList.begin(), valIt = valuesList.begin(); - parIt != paramsList.end(); i++, ++parIt,++valIt ) { + parIt != paramsList.end(); i++, ++parIt,++valIt ) { aParArray[i] = CORBA::string_dup( (*parIt).c_str() ); aValArray[i] = CORBA::string_dup( (*valIt).c_str() ); } @@ -164,15 +182,15 @@ void GEOM_IHealingOperations_i::GetShapeProcessParameters(GEOM::string_array_out * GetOperatorParameters */ //============================================================================= -void GEOM_IHealingOperations_i::GetOperatorParameters (const char* theOperator, - GEOM::string_array_out theParams, - GEOM::string_array_out theValues) +void GEOM_IHealingOperations_i::GetOperatorParameters (const char* theOperator, + GEOM::string_array_out theParams, + GEOM::string_array_out theValues) { GEOM::string_array_var aParArray = new GEOM::string_array(); GEOM::string_array_var aValArray = new GEOM::string_array(); // retrieve the values as stl-lists - list paramsList, valuesList; + std::list paramsList, valuesList; if ( GetOperations()->GetOperatorParameters( theOperator, paramsList, valuesList ) ) { const int parSize = paramsList.size(), valSize = valuesList.size(); @@ -181,12 +199,12 @@ void GEOM_IHealingOperations_i::GetOperatorParameters (const char* theOperator, aValArray->length(valSize); // fill the local CORBA arrays with values from lists - list::iterator parIt, valIt; + std::list::iterator parIt, valIt; int i; for ( i = 0, parIt = paramsList.begin(), valIt = valuesList.begin(); parIt != paramsList.end(); i++, ++parIt,++valIt ) { - aParArray[i] = CORBA::string_dup( (*parIt).c_str() ); - aValArray[i] = CORBA::string_dup( (*valIt).c_str() ); + aParArray[i] = CORBA::string_dup( (*parIt).c_str() ); + aValArray[i] = CORBA::string_dup( (*valIt).c_str() ); } } } @@ -202,23 +220,20 @@ void GEOM_IHealingOperations_i::GetOperatorParameters (const char* theOperator, */ //============================================================================= GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::SuppressFaces (GEOM::GEOM_Object_ptr theObject, - const GEOM::short_array& theFaces) + const GEOM::short_array& theFaces) { GEOM::GEOM_Object_var aGEOMObject; // Set a not done flag GetOperations()->SetNotDone(); - // Check parameters - if ( CORBA::is_nil(theObject) ) // if theFaces is empty - it's OK, it means that ALL faces must be removed - return aGEOMObject._retn(); - // Get the object itself - Handle(GEOM_Object) anObject = - GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + Handle(GEOM_Object) anObject = GetObjectImpl(theObject); if (anObject.IsNull()) return aGEOMObject._retn(); + // if theFaces is empty - it's OK, it means that ALL faces must be removed + // Perform Handle(GEOM_Object) aNewObject = GetOperations()->SuppressFaces( anObject, Convert( theFaces ) ); @@ -234,21 +249,16 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::SuppressFaces (GEOM::GEOM_Objec */ //============================================================================= GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::CloseContour (GEOM::GEOM_Object_ptr theObject, - const GEOM::short_array& theWires, - CORBA::Boolean isCommonVertex) + const GEOM::short_array& theWires, + CORBA::Boolean isCommonVertex) { GEOM::GEOM_Object_var aGEOMObject; // Set a not done flag GetOperations()->SetNotDone(); - // Check parameters - if ( CORBA::is_nil(theObject) ) - return aGEOMObject._retn(); - // Get the object itself - Handle(GEOM_Object) anObject = - GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + Handle(GEOM_Object) anObject = GetObjectImpl(theObject); if (anObject.IsNull()) return aGEOMObject._retn(); @@ -267,23 +277,20 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::CloseContour (GEOM::GEOM_Object */ //============================================================================= GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::RemoveIntWires (GEOM::GEOM_Object_ptr theObject, - const GEOM::short_array& theWires) + const GEOM::short_array& theWires) { GEOM::GEOM_Object_var aGEOMObject; // Set a not done flag GetOperations()->SetNotDone(); - // Check parameters - if ( CORBA::is_nil(theObject) ) // if theWires is empty - it's OK, it means that ALL wires should be removed - return aGEOMObject._retn(); - // Get the object itself - Handle(GEOM_Object) anObject = - GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + Handle(GEOM_Object) anObject = GetObjectImpl(theObject); if (anObject.IsNull()) return aGEOMObject._retn(); + // if theWires is empty - it's OK, it means that ALL wires should be removed + // Perform Handle(GEOM_Object) aNewObject = GetOperations()->RemoveIntWires( anObject, Convert( theWires ) ); @@ -299,23 +306,20 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::RemoveIntWires (GEOM::GEOM_Obje */ //============================================================================= GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::FillHoles (GEOM::GEOM_Object_ptr theObject, - const GEOM::short_array& theWires) + const GEOM::short_array& theWires) { GEOM::GEOM_Object_var aGEOMObject; // Set a not done flag GetOperations()->SetNotDone(); - // Check parameters - if ( CORBA::is_nil(theObject) ) // if theWires is empty - it's OK, it means that ALL wires should be removed - return aGEOMObject._retn(); - // Get the object itself - Handle(GEOM_Object) anObject = - GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + Handle(GEOM_Object) anObject = GetObjectImpl(theObject); if (anObject.IsNull()) return aGEOMObject._retn(); + // if theWires is empty - it's OK, it means that ALL wires should be removed + // Perform Handle(GEOM_Object) aNewObject = GetOperations()->FillHoles( anObject, Convert( theWires ) ); @@ -331,7 +335,7 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::FillHoles (GEOM::GEOM_Object_pt */ //============================================================================= GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::Sew (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theTolerance) + CORBA::Double theTolerance) { GEOM::GEOM_Object_var aGEOMObject; @@ -339,18 +343,73 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::Sew (GEOM::GEOM_Object_ptr theO GetOperations()->SetNotDone(); // Check parameters - if ( CORBA::is_nil(theObject) || theTolerance < 0 ) + if (theTolerance < 0) return aGEOMObject._retn(); // Get the object itself - Handle(GEOM_Object) anObject = - GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + Handle(GEOM_Object) anObject = GetObjectImpl(theObject); + if (anObject.IsNull()) + return aGEOMObject._retn(); + + // Perform + Handle(GEOM_Object) aNewObject = + GetOperations()->Sew( anObject, theTolerance, false ); + if (!GetOperations()->IsDone() || aNewObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(aNewObject); +} + +//============================================================================= +/*! + * SewAllowNonManifold + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::SewAllowNonManifold (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theTolerance) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Check parameters + if (theTolerance < 0) + return aGEOMObject._retn(); + + // Get the object itself + Handle(GEOM_Object) anObject = GetObjectImpl(theObject); if (anObject.IsNull()) return aGEOMObject._retn(); // Perform Handle(GEOM_Object) aNewObject = - GetOperations()->Sew( anObject, theTolerance ); + GetOperations()->Sew( anObject, theTolerance, true ); + if (!GetOperations()->IsDone() || aNewObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(aNewObject); +} + +//============================================================================= +/*! + * RemoveInternalFaces + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::RemoveInternalFaces (GEOM::GEOM_Object_ptr theCompound) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Get the object + Handle(GEOM_Object) anObject = GetObjectImpl(theCompound); + if (anObject.IsNull()) + return aGEOMObject._retn(); + + // Perform + Handle(GEOM_Object) aNewObject = GetOperations()->RemoveInternalFaces(anObject); if (!GetOperations()->IsDone() || aNewObject.IsNull()) return aGEOMObject._retn(); @@ -364,8 +423,8 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::Sew (GEOM::GEOM_Object_ptr theO //============================================================================= GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::DivideEdge (GEOM::GEOM_Object_ptr theObject, CORBA::Short theIndex, - CORBA::Double theValue, - CORBA::Boolean isByParameter) + CORBA::Double theValue, + CORBA::Boolean isByParameter) { GEOM::GEOM_Object_var aGEOMObject; @@ -373,12 +432,11 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::DivideEdge (GEOM::GEOM_Object_p GetOperations()->SetNotDone(); // Check parameters - if ( CORBA::is_nil(theObject) || theValue < 0 || theValue > 1 ) + if (theValue < 0 || theValue > 1) return aGEOMObject._retn(); // Get the object itself - Handle(GEOM_Object) anObject = - GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + Handle(GEOM_Object) anObject = GetObjectImpl(theObject); if (anObject.IsNull()) return aGEOMObject._retn(); @@ -391,14 +449,51 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::DivideEdge (GEOM::GEOM_Object_p return GetObject(aNewObject); } +//============================================================================= +/*! + * FuseCollinearEdgesWithinWire + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::FuseCollinearEdgesWithinWire + (GEOM::GEOM_Object_ptr theWire, + const GEOM::ListOfGO& theVertices) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference objects + Handle(GEOM_Object) aWire = GetObjectImpl(theWire); + if (aWire.IsNull()) return aGEOMObject._retn(); + + int ind, aLen; + std::list aVerts; + //Get the shapes + aLen = theVertices.length(); + for (ind = 0; ind < aLen; ind++) { + Handle(GEOM_Object) aSh = GetObjectImpl(theVertices[ind]); + if (aSh.IsNull()) return aGEOMObject._retn(); + aVerts.push_back(aSh); + } + + //Perform operation + Handle(GEOM_Object) anObject = + GetOperations()->FuseCollinearEdgesWithinWire(aWire, aVerts); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * GetFreeBoundary */ //============================================================================= CORBA::Boolean GEOM_IHealingOperations_i::GetFreeBoundary ( GEOM::GEOM_Object_ptr theObject, - GEOM::ListOfGO_out theClosedWires, - GEOM::ListOfGO_out theOpenWires ) + GEOM::ListOfGO_out theClosedWires, + GEOM::ListOfGO_out theOpenWires ) { theClosedWires = new GEOM::ListOfGO; theOpenWires = new GEOM::ListOfGO; @@ -406,12 +501,8 @@ CORBA::Boolean GEOM_IHealingOperations_i::GetFreeBoundary ( GEOM::GEOM_Object_pt // Set a not done flag GetOperations()->SetNotDone(); - if ( CORBA::is_nil(theObject) ) - return false; - // Get the object itself - Handle(GEOM_Object) anObject = - GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + Handle(GEOM_Object) anObject = GetObjectImpl(theObject); if (anObject.IsNull()) return false; @@ -420,7 +511,7 @@ CORBA::Boolean GEOM_IHealingOperations_i::GetFreeBoundary ( GEOM::GEOM_Object_pt bool res = GetOperations()->GetFreeBoundary( anObject, aClosed, anOpen ); if ( !GetOperations()->IsDone() || !res ) - return false; + return false; int i, n = aClosed->Length(); theClosedWires->length( n ); @@ -434,3 +525,91 @@ CORBA::Boolean GEOM_IHealingOperations_i::GetFreeBoundary ( GEOM::GEOM_Object_pt return true; } + + +//============================================================================= +/*! + * ChangeOrientation + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::ChangeOrientation (GEOM::GEOM_Object_ptr theObject) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Check parameters + if ( CORBA::is_nil(theObject) ) + return aGEOMObject._retn(); + + aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject); + + // Get the object itself + Handle(GEOM_Object) anObject = GetObjectImpl(theObject); + if (anObject.IsNull()) + return aGEOMObject._retn(); + + // Perform +// Handle(GEOM_Object) aNewObject = + GetOperations()->ChangeOrientation( anObject ); +// if (!GetOperations()->IsDone() || aNewObject.IsNull()) +// return aGEOMObject._retn(); + + //return GetObject(aNewObject); + return aGEOMObject._retn(); +} + + +//============================================================================= +/*! + * ChangeOrientationCopy + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::ChangeOrientationCopy (GEOM::GEOM_Object_ptr theObject) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Get the object itself + Handle(GEOM_Object) anObject = GetObjectImpl(theObject); + if (anObject.IsNull()) + return aGEOMObject._retn(); + + // Perform + Handle(GEOM_Object) aNewObject = + GetOperations()->ChangeOrientationCopy( anObject ); + if (!GetOperations()->IsDone() || aNewObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(aNewObject); +} + +//============================================================================= +/*! + * LimitTolerance + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::LimitTolerance (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theTolerance) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Get the object itself + Handle(GEOM_Object) anObject = GetObjectImpl(theObject); + if (anObject.IsNull()) + return aGEOMObject._retn(); + + // Perform + Handle(GEOM_Object) aNewObject = + GetOperations()->LimitTolerance(anObject, theTolerance); + if (!GetOperations()->IsDone() || aNewObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(aNewObject); +}