]> SALOME platform Git repositories - modules/geom.git/blobdiff - src/GEOMImpl/GEOMImpl_FilletDriver.cxx
Salome HOME
0022743: EDF GEOM: Regression in MakePipeTShapeChamfer: Some faces are missing in...
[modules/geom.git] / src / GEOMImpl / GEOMImpl_FilletDriver.cxx
index 01d1dcd2b5d695357fb678d819522be41692b0f8..f8b6756a0b8839353751e1bf0a241a58cbf0a750 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// 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
@@ -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
 #include <gp_Pnt.hxx>
 #include <StdFail_NotDone.hxx>
 
+// VSR 08/12/2014: debug PipeTShape function
+// Uncomment the macro below to correct tolerance of resulting face after creating fillet
+#define FIX_FACE_TOLERANCE
+
+namespace
+{
+  bool FixShape( TopoDS_Shape& shape,
+                 TopAbs_ShapeEnum type = TopAbs_SHAPE,
+                 Standard_Real tolerance = Precision::Confusion() )
+  {
+    ShapeFix_ShapeTolerance aSFT;
+    aSFT.LimitTolerance( shape, tolerance, tolerance, type );
+    Handle(ShapeFix_Shape) aSfs = new ShapeFix_Shape( shape );
+    aSfs->Perform();
+    shape = aSfs->Shape();
+    BRepCheck_Analyzer ana( shape, false );
+    return ana.IsValid();
+  }
+}
+
 //=======================================================================
 //function : GetID
 //purpose  :
@@ -135,20 +155,16 @@ Standard_Integer GEOMImpl_FilletDriver::Execute(TFunction_Logbook& log) const
 
   if (aShape.IsNull()) return 0;
 
+#ifdef FIX_FACE_TOLERANCE
+  bool isOk = FixShape(aShape, TopAbs_FACE);
+#else
   // Check shape validity
-  BRepCheck_Analyzer ana (aShape, false);
-  if (!ana.IsValid()) {
-    // 08.07.2008 added by skl during fixing bug 19761 from Mantis
-    ShapeFix_ShapeTolerance aSFT;
-    aSFT.LimitTolerance(aShape, Precision::Confusion(),
-                        Precision::Confusion(), TopAbs_SHAPE);
-    Handle(ShapeFix_Shape) aSfs = new ShapeFix_Shape(aShape);
-    aSfs->Perform();
-    aShape = aSfs->Shape();
-    ana.Init(aShape);
-    if (!ana.IsValid())
-      StdFail_NotDone::Raise("Fillet algorithm have produced an invalid shape result");
-  }
+  BRepCheck_Analyzer ana(aShape, false);
+  // 08.07.2008 added by skl during fixing bug 19761 from Mantis
+  bool isOk = ana.IsValid() || FixShape(aShape);
+#endif
+  if ( !isOk )
+    StdFail_NotDone::Raise("Fillet algorithm have produced an invalid shape result");
 
   aFunction->SetValue(aShape);
 
@@ -157,45 +173,67 @@ Standard_Integer GEOMImpl_FilletDriver::Execute(TFunction_Logbook& log) const
   return 1;
 }
 
+//================================================================================
+/*!
+ * \brief Returns a name of creation operation and names and values of creation parameters
+ */
+//================================================================================
 
-//=======================================================================
-//function :  GEOMImpl_FilletDriver_Type_
-//purpose  :
-//=======================================================================
-Standard_EXPORT Handle_Standard_Type& GEOMImpl_FilletDriver_Type_()
+bool GEOMImpl_FilletDriver::
+GetCreationInformation(std::string&             theOperationName,
+                       std::vector<GEOM_Param>& theParams)
 {
-
-  static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver);
-  if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver);
-  static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared);
-  if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared);
-  static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient);
-  if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient);
-
-
-  static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL};
-  static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_FilletDriver",
-                                                         sizeof(GEOMImpl_FilletDriver),
-                                                         1,
-                                                         (Standard_Address)_Ancestors,
-                                                         (Standard_Address)NULL);
-
-  return _aType;
-}
-
-//=======================================================================
-//function : DownCast
-//purpose  :
-//=======================================================================
-const Handle(GEOMImpl_FilletDriver) Handle(GEOMImpl_FilletDriver)::DownCast(const Handle(Standard_Transient)& AnObject)
-{
-  Handle(GEOMImpl_FilletDriver) _anOtherObject;
-
-  if (!AnObject.IsNull()) {
-     if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_FilletDriver))) {
-       _anOtherObject = Handle(GEOMImpl_FilletDriver)((Handle(GEOMImpl_FilletDriver)&)AnObject);
-     }
+  if (Label().IsNull()) return 0;
+  Handle(GEOM_Function) function = GEOM_Function::GetFunction(Label());
+
+  GEOMImpl_IFillet aCI( function );
+  Standard_Integer aType = function->GetType();
+
+  theOperationName = "FILLET";
+
+  switch ( aType ) {
+  case FILLET_SHAPE_ALL:
+    AddParam( theParams, "Main Object", aCI.GetShape() );
+    AddParam( theParams, "Selected edges", "all" );
+    break;
+  case FILLET_SHAPE_EDGES:
+  case FILLET_SHAPE_EDGES_2R:
+    AddParam( theParams, "Main Object", aCI.GetShape() );
+    AddParam( theParams, "Selected edges" );
+    if ( aCI.GetLength() > 1 )
+      theParams[1] << aCI.GetLength() << " edges: ";
+    for (int i = 1; i <= aCI.GetLength(); ++i )
+      theParams[1] << aCI.GetEdge( i ) << " ";
+    if ( aType == FILLET_SHAPE_EDGES ) {
+      AddParam( theParams, "Radius", aCI.GetR() );
+    }
+    else {
+      AddParam( theParams, "R1", aCI.GetR1() );
+      AddParam( theParams, "R2", aCI.GetR2() );
+    }
+    break;
+  case FILLET_SHAPE_FACES:
+  case FILLET_SHAPE_FACES_2R:
+    AddParam( theParams, "Main Object", aCI.GetShape() );
+    AddParam( theParams, "Selected faces" );
+    if ( aCI.GetLength() > 1 )
+      theParams[1] << aCI.GetLength() << " faces: ";
+    for (int i = 1; i <= aCI.GetLength(); ++i )
+      theParams[1] << aCI.GetFace( i ) << " ";
+    if ( aType == FILLET_SHAPE_FACES ) {
+      AddParam( theParams, "Radius", aCI.GetR() );
+    }
+    else {
+      AddParam( theParams, "R1", aCI.GetR1() );
+      AddParam( theParams, "R2", aCI.GetR2() );
+    }
+    break;
+  default:
+    return false;
   }
-
-  return _anOtherObject ;
+  
+  return true;
 }
+
+IMPLEMENT_STANDARD_HANDLE (GEOMImpl_FilletDriver,GEOM_BaseDriver);
+IMPLEMENT_STANDARD_RTTIEXT (GEOMImpl_FilletDriver,GEOM_BaseDriver);