Salome HOME
23586: [EDF] HYDRO: Copy mesh to new geometry
[modules/geom.git] / src / GEOM_I / GEOM_IHealingOperations_i.cc
index 51fe6c46e7dc406265bbcbb7d3e5f762b6f12f4e..d83e0d16136e37c473307b917e852aab0ab743a6 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  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
 #include "GEOM_IHealingOperations_i.hh"
 #include "GEOM_Engine.hxx"
 #include "GEOM_Object.hxx"
+#include "ShHealOper_ModifStats.hxx"
 
-#include "utilities.h"
-#include "OpUtil.hxx"
-#include "Utils_ExceptHandlers.hxx"
+#include <utilities.h>
+#include <OpUtil.hxx>
+#include <Utils_ExceptHandlers.hxx>
 #include <Basics_Utils.hxx>
 
 #include <TColStd_HSequenceOfTransient.hxx>
@@ -100,12 +101,12 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::ProcessShape (GEOM::GEOM_Object
   //  return aGEOMObject._retn();
 
   // Get the object itself
-  Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
+  Handle(::GEOM_Object) anObject = GetObjectImpl(theObject);
   if (anObject.IsNull())
     return aGEOMObject._retn();
 
   // Perform
-  Handle(GEOM_Object) aNewObject = GetOperations()->ShapeProcess( anObject,
+  Handle(::GEOM_Object) aNewObject = GetOperations()->ShapeProcess( anObject,
     ConvertStringArray( theOperations ), ConvertStringArray( theParams ),
     ConvertStringArray( theValues ) );
   if ( !GetOperations()->IsDone() || aNewObject.IsNull() )
@@ -210,14 +211,14 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::SuppressFaces (GEOM::GEOM_Objec
   GetOperations()->SetNotDone();
 
   // Get the object itself
-  Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
+  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 =
+  Handle(::GEOM_Object) aNewObject =
     GetOperations()->SuppressFaces( anObject, Convert( theFaces ) );
   if (!GetOperations()->IsDone() || aNewObject.IsNull())
     return aGEOMObject._retn();
@@ -240,12 +241,12 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::CloseContour (GEOM::GEOM_Object
   GetOperations()->SetNotDone();
 
   // Get the object itself
-  Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
+  Handle(::GEOM_Object) anObject = GetObjectImpl(theObject);
   if (anObject.IsNull())
     return aGEOMObject._retn();
 
   // Perform
-  Handle(GEOM_Object) aNewObject =
+  Handle(::GEOM_Object) aNewObject =
     GetOperations()->CloseContour( anObject, Convert( theWires ), isCommonVertex );
   if (!GetOperations()->IsDone() || aNewObject.IsNull())
     return aGEOMObject._retn();
@@ -267,14 +268,14 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::RemoveIntWires (GEOM::GEOM_Obje
   GetOperations()->SetNotDone();
 
   // Get the object itself
-  Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
+  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 =
+  Handle(::GEOM_Object) aNewObject =
     GetOperations()->RemoveIntWires( anObject, Convert( theWires ) );
   if (!GetOperations()->IsDone() || aNewObject.IsNull())
     return aGEOMObject._retn();
@@ -296,14 +297,14 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::FillHoles (GEOM::GEOM_Object_pt
   GetOperations()->SetNotDone();
 
   // Get the object itself
-  Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
+  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 =
+  Handle(::GEOM_Object) aNewObject =
     GetOperations()->FillHoles( anObject, Convert( theWires ) );
   if (!GetOperations()->IsDone() || aNewObject.IsNull())
     return aGEOMObject._retn();
@@ -316,8 +317,8 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::FillHoles (GEOM::GEOM_Object_pt
  *  Sew
  */
 //=============================================================================
-GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::Sew (GEOM::GEOM_Object_ptr theObject,
-                                                      CORBA::Double theTolerance)
+GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::Sew (const GEOM::ListOfGO& theObjects,
+                                                      CORBA::Double         theTolerance)
 {
   GEOM::GEOM_Object_var aGEOMObject;
 
@@ -328,14 +329,13 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::Sew (GEOM::GEOM_Object_ptr theO
   if (theTolerance < 0)
     return aGEOMObject._retn();
 
-  // Get the object itself
-  Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
-  if (anObject.IsNull())
+  //Get the shapes
+  std::list< Handle(::GEOM_Object) > aShapes;
+  if (! GetListOfObjectsImpl( theObjects, aShapes ))
     return aGEOMObject._retn();
 
   // Perform
-  Handle(GEOM_Object) aNewObject =
-    GetOperations()->Sew( anObject, theTolerance, false );
+  Handle(::GEOM_Object) aNewObject = GetOperations()->Sew( aShapes, theTolerance, false );
   if (!GetOperations()->IsDone() || aNewObject.IsNull())
     return aGEOMObject._retn();
 
@@ -347,8 +347,9 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::Sew (GEOM::GEOM_Object_ptr theO
  *  SewAllowNonManifold
  */
 //=============================================================================
-GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::SewAllowNonManifold (GEOM::GEOM_Object_ptr theObject,
-                                                                      CORBA::Double theTolerance)
+GEOM::GEOM_Object_ptr
+GEOM_IHealingOperations_i::SewAllowNonManifold (const GEOM::ListOfGO& theObjects,
+                                                CORBA::Double         theTolerance)
 {
   GEOM::GEOM_Object_var aGEOMObject;
 
@@ -359,14 +360,13 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::SewAllowNonManifold (GEOM::GEOM
   if (theTolerance < 0)
     return aGEOMObject._retn();
 
-  // Get the object itself
-  Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
-  if (anObject.IsNull())
+  //Get the shapes
+  std::list< Handle(::GEOM_Object) > aShapes;
+  if (! GetListOfObjectsImpl( theObjects, aShapes ))
     return aGEOMObject._retn();
 
   // Perform
-  Handle(GEOM_Object) aNewObject =
-    GetOperations()->Sew( anObject, theTolerance, true );
+  Handle(::GEOM_Object) aNewObject = GetOperations()->Sew( aShapes, theTolerance, true );
   if (!GetOperations()->IsDone() || aNewObject.IsNull())
     return aGEOMObject._retn();
 
@@ -378,20 +378,21 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::SewAllowNonManifold (GEOM::GEOM
  *  RemoveInternalFaces
  */
 //=============================================================================
-GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::RemoveInternalFaces (GEOM::GEOM_Object_ptr theCompound)
+GEOM::GEOM_Object_ptr
+GEOM_IHealingOperations_i::RemoveInternalFaces (const GEOM::ListOfGO& theSolids)
 {
   GEOM::GEOM_Object_var aGEOMObject;
 
   // Set a not done flag
   GetOperations()->SetNotDone();
 
-  // Get the object
-  Handle(GEOM_Object) anObject = GetObjectImpl(theCompound);
-  if (anObject.IsNull())
+  // Get the objects
+  std::list< Handle(::GEOM_Object) > aShapes;
+  if (! GetListOfObjectsImpl( theSolids, aShapes ))
     return aGEOMObject._retn();
 
   // Perform
-  Handle(GEOM_Object) aNewObject = GetOperations()->RemoveInternalFaces(anObject);
+  Handle(::GEOM_Object) aNewObject = GetOperations()->RemoveInternalFaces(aShapes);
   if (!GetOperations()->IsDone() || aNewObject.IsNull())
     return aGEOMObject._retn();
 
@@ -418,12 +419,12 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::DivideEdge (GEOM::GEOM_Object_p
     return aGEOMObject._retn();
 
   // Get the object itself
-  Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
+  Handle(::GEOM_Object) anObject = GetObjectImpl(theObject);
   if (anObject.IsNull())
     return aGEOMObject._retn();
 
   // Perform
-  Handle(GEOM_Object) aNewObject =
+  Handle(::GEOM_Object) aNewObject =
     GetOperations()->DivideEdge( anObject, theIndex, theValue, isByParameter );
   if (!GetOperations()->IsDone() || aNewObject.IsNull())
     return aGEOMObject._retn();
@@ -431,6 +432,40 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::DivideEdge (GEOM::GEOM_Object_p
   return GetObject(aNewObject);
 }
 
+//=============================================================================
+/*!
+ *  DivideEdgeByPoint
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr
+GEOM_IHealingOperations_i::DivideEdgeByPoint (GEOM::GEOM_Object_ptr theObject,
+                                              CORBA::Short          theIndex,
+                                              const GEOM::ListOfGO& thePoints)
+{
+  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();
+
+  // Get the points
+  std::list< Handle(::GEOM_Object) > aPoints;
+  if (! GetListOfObjectsImpl( thePoints, aPoints ))
+    return aGEOMObject._retn();
+
+  // Perform
+  Handle(::GEOM_Object) aNewObject =
+    GetOperations()->DivideEdgeByPoint( anObject, theIndex, aPoints );
+  if (!GetOperations()->IsDone() || aNewObject.IsNull())
+    return aGEOMObject._retn();
+
+  return GetObject(aNewObject);
+}
+
 //=============================================================================
 /*!
  *  FuseCollinearEdgesWithinWire
@@ -446,21 +481,21 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::FuseCollinearEdgesWithinWire
   GetOperations()->SetNotDone();
 
   //Get the reference objects
-  Handle(GEOM_Object) aWire = GetObjectImpl(theWire);
+  Handle(::GEOM_Object) aWire = GetObjectImpl(theWire);
   if (aWire.IsNull()) return aGEOMObject._retn();
 
   int ind, aLen;
-  std::list<Handle(GEOM_Object)> aVerts;
+  std::list<Handle(::GEOM_Object)> aVerts;
   //Get the shapes
   aLen = theVertices.length();
   for (ind = 0; ind < aLen; ind++) {
-    Handle(GEOM_Object) aSh = GetObjectImpl(theVertices[ind]);
+    Handle(::GEOM_Object) aSh = GetObjectImpl(theVertices[ind]);
     if (aSh.IsNull()) return aGEOMObject._retn();
     aVerts.push_back(aSh);
   }
 
   //Perform operation
-  Handle(GEOM_Object) anObject =
+  Handle(::GEOM_Object) anObject =
     GetOperations()->FuseCollinearEdgesWithinWire(aWire, aVerts);
   if (!GetOperations()->IsDone() || anObject.IsNull())
     return aGEOMObject._retn();
@@ -473,9 +508,10 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::FuseCollinearEdgesWithinWire
  *  GetFreeBoundary
  */
 //=============================================================================
-CORBA::Boolean GEOM_IHealingOperations_i::GetFreeBoundary ( GEOM::GEOM_Object_ptr theObject,
-                                                            GEOM::ListOfGO_out theClosedWires,
-                                                            GEOM::ListOfGO_out theOpenWires )
+CORBA::Boolean
+GEOM_IHealingOperations_i::GetFreeBoundary ( const GEOM::ListOfGO & theObjects,
+                                             GEOM::ListOfGO_out     theClosedWires,
+                                             GEOM::ListOfGO_out     theOpenWires )
 {
   theClosedWires = new GEOM::ListOfGO;
   theOpenWires = new GEOM::ListOfGO;
@@ -483,14 +519,19 @@ CORBA::Boolean GEOM_IHealingOperations_i::GetFreeBoundary ( GEOM::GEOM_Object_pt
   // Set a not done flag
   GetOperations()->SetNotDone();
 
-  // Get the object itself
-  Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
-  if (anObject.IsNull())
-    return false;
+  // Get the objects
+  Handle(TColStd_HSequenceOfTransient) anObjects = new TColStd_HSequenceOfTransient();
+  for ( size_t i = 0; i < theObjects.length(); ++i )
+  {
+    Handle(::GEOM_Object) anObject = GetObjectImpl(theObjects[i]);
+    if (anObject.IsNull())
+      return false;
+    anObjects->Append( anObject );
+  }
 
   Handle(TColStd_HSequenceOfTransient) aClosed = new TColStd_HSequenceOfTransient();
   Handle(TColStd_HSequenceOfTransient) anOpen  = new TColStd_HSequenceOfTransient();
-  bool res = GetOperations()->GetFreeBoundary( anObject, aClosed, anOpen );
+  bool res = GetOperations()->GetFreeBoundary( anObjects, aClosed, anOpen );
 
   if ( !GetOperations()->IsDone() || !res )
     return false;
@@ -498,12 +539,12 @@ CORBA::Boolean GEOM_IHealingOperations_i::GetFreeBoundary ( GEOM::GEOM_Object_pt
   int i, n = aClosed->Length();
   theClosedWires->length( n );
   for ( i = 1; i <= n; i++ )
-    (*theClosedWires)[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aClosed->Value(i)));
+    (*theClosedWires)[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(aClosed->Value(i)));
 
   n = anOpen->Length();
   theOpenWires->length( n );
   for ( i = 1, n = anOpen->Length(); i <= n; i++ )
-    (*theOpenWires)[i-1] = GetObject(Handle(GEOM_Object)::DownCast(anOpen->Value(i)));
+    (*theOpenWires)[i-1] = GetObject(Handle(::GEOM_Object)::DownCast(anOpen->Value(i)));
 
   return true;
 }
@@ -528,12 +569,12 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::ChangeOrientation (GEOM::GEOM_O
   aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
 
   // Get the object itself
-  Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
+  Handle(::GEOM_Object) anObject = GetObjectImpl(theObject);
   if (anObject.IsNull())
     return aGEOMObject._retn();
 
   // Perform
-//  Handle(GEOM_Object) aNewObject =
+//  Handle(::GEOM_Object) aNewObject =
     GetOperations()->ChangeOrientation( anObject );
 //  if (!GetOperations()->IsDone() || aNewObject.IsNull())
 //    return aGEOMObject._retn();
@@ -556,12 +597,12 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::ChangeOrientationCopy (GEOM::GE
   GetOperations()->SetNotDone();
 
   // Get the object itself
-  Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
+  Handle(::GEOM_Object) anObject = GetObjectImpl(theObject);
   if (anObject.IsNull())
     return aGEOMObject._retn();
 
   // Perform
-  Handle(GEOM_Object) aNewObject =
+  Handle(::GEOM_Object) aNewObject =
     GetOperations()->ChangeOrientationCopy( anObject );
   if (!GetOperations()->IsDone() || aNewObject.IsNull())
     return aGEOMObject._retn();
@@ -583,15 +624,45 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::LimitTolerance (GEOM::GEOM_Obje
   GetOperations()->SetNotDone();
 
   // Get the object itself
-  Handle(GEOM_Object) anObject = GetObjectImpl(theObject);
+  Handle(::GEOM_Object) anObject = GetObjectImpl(theObject);
   if (anObject.IsNull())
     return aGEOMObject._retn();
 
   // Perform
-  Handle(GEOM_Object) aNewObject =
+  Handle(::GEOM_Object) aNewObject =
     GetOperations()->LimitTolerance(anObject, theTolerance);
   if (!GetOperations()->IsDone() || aNewObject.IsNull())
     return aGEOMObject._retn();
 
   return GetObject(aNewObject);
 }
+
+//================================================================================
+/*!
+ * \brief Return information on what has been done by the last called healing method
+ */
+//================================================================================
+
+GEOM::ModifStatistics* GEOM_IHealingOperations_i::GetStatistics()
+{
+  const ShHealOper_ModifStats& stats = * GetOperations()->GetStatistics();
+  const std::set< ShHealOper_ModifStats::Datum >& modifs = stats.GetData();
+  std::set< ShHealOper_ModifStats::Datum >::const_iterator modif = modifs.begin();
+
+  GEOM::ModifStatistics_var statsVar = new GEOM::ModifStatistics();
+  statsVar->length( modifs.size() );
+  for ( int i = 0; modif != modifs.end(); ++modif, ++i )
+  {
+    statsVar[ i ].name = modif->myModif.c_str();
+    statsVar[ i ].count = modif->myCount;
+
+    // Cut off "Unknown message invoked with the keyword " at the beginning
+    const char* toRm = "Unknown message invoked with the keyword ";
+    const size_t lenToRm = strlen( toRm );
+    if ( modif->myModif.size() > lenToRm &&
+         modif->myModif.compare( 0, lenToRm, toRm ) == 0 )
+      statsVar[ i ].name = modif->myModif.substr( lenToRm ).c_str();
+  }
+
+  return statsVar._retn();
+}