Salome HOME
updated copyright message
[modules/geom.git] / src / ShHealOper / ShHealOper_ShapeProcess.cxx
index 56503fbb4ef8ccb122fa83e607c20e127fe4a703..43bb1e131ecb0fecae6239d5d2f83b8646417bb4 100644 (file)
@@ -1,25 +1,29 @@
-// File:      ShHealOper_ShapeProcess.cxx
-// Created:   14.04.04 10:58:04
-// Author:    Galina KULIKOVA
-//  < MODULE = KERNEL> <PACKAGE = ShHealOper> : <Shape Healing Operations>
-//  Copyright (C) 2003  CEA
+// Copyright (C) 2007-2023  CEA, EDF, OPEN CASCADE
 //
-//  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.
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 //
-
-//  This library is distributed in the hope that it will be useful,
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-//  Lesser General Public License for more details.
+// This library is 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.
 //
-//  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
+// 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
 //
 
+// File:      ShHealOper_ShapeProcess.cxx
+// Created:   14.04.04 10:58:04
+// Author:    Galina KULIKOVA
+//
 #include <ShHealOper_ShapeProcess.hxx>
 #include <ShapeProcessAPI_ApplySequence.hxx>
 #include <ShapeProcess_Context.hxx>
 #include <TopAbs_ShapeEnum.hxx>
 #include <TopTools_DataMapOfShapeShape.hxx>
 #include <ShapeProcess_ShapeContext.hxx>
+#include <ShapeAnalysis_ShapeTolerance.hxx>
+#include <Precision.hxx>
+#include <BRep_Builder.hxx>
+#include <TopoDS_Iterator.hxx>
+#include <TColStd_IndexedDataMapOfTransientTransient.hxx>
+#include <TNaming_CopyShape.hxx>
+#include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
+#include <ShapeExtend_MsgRegistrator.hxx>
+#include <ShapeExtend_DataMapOfShapeListOfMsg.hxx>
+#include <ShapeExtend_DataMapIteratorOfDataMapOfShapeListOfMsg.hxx>
+#include <Message_ListOfMsg.hxx>
+#include <Message_ListIteratorOfListOfMsg.hxx>
+#include <Message_Msg.hxx>
+
 //=======================================================================
 //function : ShHealOper_ShapeProcess()
 //purpose  : Constructor
@@ -41,8 +59,9 @@ ShHealOper_ShapeProcess::ShHealOper_ShapeProcess (  ) :
    //myResource = new Resource_Manager("ShHealing");
    myPrefix = "ShapeProcess";
    mySaveHistoryMode = Standard_False;
-   myLevel = TopAbs_FACE;
+   myLevel = TopAbs_EDGE;
    myDone = Standard_False;
+   myOperations.Context()->SetDetalisation ( TopAbs_EDGE );
 }
 
 //=======================================================================
@@ -52,36 +71,70 @@ ShHealOper_ShapeProcess::ShHealOper_ShapeProcess (  ) :
 
 ShHealOper_ShapeProcess::ShHealOper_ShapeProcess (const TCollection_AsciiString& theNameResource,
                                                   const TCollection_AsciiString& thePrefix ) :
-       myOperations(theNameResource.ToCString(),thePrefix.ToCString())
+  myOperations(theNameResource.ToCString(),thePrefix.ToCString())
 {
   //myResource = new Resource_Manager(theNameResource);
   myPrefix = thePrefix;
   mySaveHistoryMode = Standard_False;
-  myLevel = TopAbs_FACE;
+  myLevel = TopAbs_EDGE;
   myDone = Standard_False;
 }
 
 //=======================================================================
 //function : Perform
-//purpose  : 
+//purpose  :
 //=======================================================================
-void ShHealOper_ShapeProcess::Perform(const TopoDS_Shape& theOldShape, 
-                                           TopoDS_Shape& theNewShape)
+void ShHealOper_ShapeProcess::Perform(const TopoDS_Shape& theOldShape,
+                                      TopoDS_Shape&       theNewShape)
 {
-  
   myMapModifications.Clear();
   //ShapeProcessAPI_ApplySequence aOperations(myResource,myPrefix.ToCString());
   //myDone = Standard_False;
   myOperations.ClearMap();
-  
-  theNewShape = myOperations.PrepareShape(theOldShape,mySaveHistoryMode,myLevel);
+  ShapeAnalysis_ShapeTolerance aSatol;
+  Standard_Real ainitTol = aSatol.Tolerance(theOldShape,0);
+
+  // PAL6487: san -- preserve the original shape from being modified
+  TopoDS_Shape anOldShape;
+  TColStd_IndexedDataMapOfTransientTransient aMap;
+  TNaming_CopyShape::CopyTool(theOldShape, aMap, anOldShape);
+  // PAL6487: san -- preserve the original shape from being modified
+
+  theNewShape = myOperations.PrepareShape(anOldShape,mySaveHistoryMode,myLevel);
   if(mySaveHistoryMode)
     myMapModifications = myOperations.Map();
-  myDone = !theOldShape.IsSame(theNewShape);
+  myDone = !anOldShape.IsSame(theNewShape);
+  if(!myDone) {
+    Standard_Real aendTol =aSatol.Tolerance(theNewShape,0);
+    myDone = (fabs(ainitTol - aendTol) > Precision::Confusion());
+    if ( myDone ) {
+      if ( ainitTol > aendTol )
+        myStatistics.AddModif( "Tolerance fixed (decreased)" );
+      else
+        myStatistics.AddModif( "Tolerance fixed (increased)" );
+    }
+  }
+
+  // fill myStatistics with messages
+  Handle(ShapeExtend_MsgRegistrator) msg = myOperations.Context()->Messages();
+  const ShapeExtend_DataMapOfShapeListOfMsg& shape2msg = msg->MapShape();
+  ShapeExtend_DataMapIteratorOfDataMapOfShapeListOfMsg s2msg( shape2msg );
+  for ( ; s2msg.More(); s2msg.Next() )
+  {
+    const Message_ListOfMsg & msgList = s2msg.Value();
+    Message_ListIteratorOfListOfMsg mIt( msgList );
+    for ( ; mIt.More(); mIt.Next() )
+    {
+      Message_Msg& m = mIt.Value();
+      TCollection_AsciiString txt = m.Get();
+      myStatistics.AddModif( txt.ToCString() );
+    }
+  }
 }
+
 //=======================================================================
 //function : SetOperators
-//purpose  : 
+//purpose  :
 //=======================================================================
 
 void ShHealOper_ShapeProcess::SetOperators(const TColStd_SequenceOfAsciiString& theSeqOperators)
@@ -104,18 +157,18 @@ void ShHealOper_ShapeProcess::SetOperators(const TColStd_SequenceOfAsciiString&
 //purpose  : 
 //=======================================================================
 
-void  ShHealOper_ShapeProcess::SetParameter(const TCollection_AsciiString& theNameParam,
-                                    const TCollection_AsciiString& theVal)
+void ShHealOper_ShapeProcess::SetParameter(const TCollection_AsciiString& theNameParam,
+                                           const TCollection_AsciiString& theVal)
 {
   TCollection_AsciiString anameParam(myPrefix);
   anameParam += ".";
   anameParam+= theNameParam;
-  if(theVal.IsIntegerValue())
-    myOperations.Context()->ResourceManager()->
-      SetResource(anameParam.ToCString(),theVal.IntegerValue());
-  else if(theVal.IsRealValue())
+  if(theVal.IsRealValue())
     myOperations.Context()->ResourceManager()->
       SetResource(anameParam.ToCString(),theVal.RealValue());
+  else if(theVal.IsIntegerValue())
+    myOperations.Context()->ResourceManager()->
+      SetResource(anameParam.ToCString(),theVal.IntegerValue());
   else
     myOperations.Context()->ResourceManager()->
       SetResource(anameParam.ToCString(),theVal.ToCString());
@@ -148,14 +201,14 @@ Standard_Boolean ShHealOper_ShapeProcess::GetOperators(TColStd_SequenceOfAsciiSt
 //=======================================================================
 
 Standard_Boolean ShHealOper_ShapeProcess::GetParameter(const TCollection_AsciiString& theNameParam,
-                                       TCollection_AsciiString& theVal)
+                                                       TCollection_AsciiString& theVal)
 {
   TCollection_AsciiString namePar(myPrefix);
   namePar += ".";
   namePar += theNameParam;
   if(!myOperations.Context()->ResourceManager()->Find(namePar.ToCString()))
     return Standard_False;
-  
+
   theVal = myOperations.Context()->ResourceManager()->Value(namePar.ToCString());
   return Standard_True;
 }