diff --git a/src/BRepMesh/BRepMesh_Deflection.cxx b/src/BRepMesh/BRepMesh_Deflection.cxx index 9110114056..776c7235bb 100644 --- a/src/BRepMesh/BRepMesh_Deflection.cxx +++ b/src/BRepMesh/BRepMesh_Deflection.cxx @@ -145,18 +145,22 @@ void BRepMesh_Deflection::ComputeDeflection ( } Standard_Real aFaceDeflection = 0.0; - if (theDFace->WiresNb () > 0) + if (!theParameters.ForceFaceDeflection) { - for (Standard_Integer aWireIt = 0; aWireIt < theDFace->WiresNb(); ++aWireIt) + if (theDFace->WiresNb () > 0) { - aFaceDeflection += theDFace->GetWire(aWireIt)->GetDeflection(); + for (Standard_Integer aWireIt = 0; aWireIt < theDFace->WiresNb (); ++aWireIt) + { + aFaceDeflection += theDFace->GetWire (aWireIt)->GetDeflection (); + } + + aFaceDeflection /= theDFace->WiresNb (); } - aFaceDeflection /= theDFace->WiresNb (); + aFaceDeflection = Max (2. * BRepMesh_ShapeTool::MaxFaceTolerance ( + theDFace->GetFace ()), aFaceDeflection); } + aFaceDeflection = Max (aDeflection, aFaceDeflection); - aFaceDeflection = Max(aDeflection, aFaceDeflection); - - theDFace->SetDeflection (Max(2.* BRepMesh_ShapeTool::MaxFaceTolerance( - theDFace->GetFace()), aFaceDeflection)); + theDFace->SetDeflection (aFaceDeflection); } diff --git a/src/BRepMesh/BRepMesh_ShapeTool.cxx b/src/BRepMesh/BRepMesh_ShapeTool.cxx index 83af4d6015..98572df738 100644 --- a/src/BRepMesh/BRepMesh_ShapeTool.cxx +++ b/src/BRepMesh/BRepMesh_ShapeTool.cxx @@ -72,7 +72,7 @@ Standard_Real BRepMesh_ShapeTool::MaxFaceTolerance(const TopoDS_Face& theFace) Standard_Real aMaxTolerance = BRep_Tool::Tolerance(theFace); Standard_Real aTolerance = Max( - MaxTolerance(theFace), + MaxTolerance(theFace), MaxTolerance(theFace)); return Max(aMaxTolerance, aTolerance); diff --git a/src/IMeshTools/IMeshTools_Parameters.hxx b/src/IMeshTools/IMeshTools_Parameters.hxx index 6279708a78..66d1cb555e 100644 --- a/src/IMeshTools/IMeshTools_Parameters.hxx +++ b/src/IMeshTools/IMeshTools_Parameters.hxx @@ -34,7 +34,8 @@ struct IMeshTools_Parameters { InternalVerticesMode (Standard_True), ControlSurfaceDeflection (Standard_True), CleanModel (Standard_True), - AdjustMinSize (Standard_False) + AdjustMinSize (Standard_False), + ForceFaceDeflection (Standard_False) { } @@ -83,6 +84,10 @@ struct IMeshTools_Parameters { //! Enables/disables local adjustment of min size depending on edge size. //! Disabled by default. Standard_Boolean AdjustMinSize; + + //! Enables/disables usage of shape tolerances for computing face deflection. + //! Disabled by default. + Standard_Boolean ForceFaceDeflection; }; #endif diff --git a/src/MeshTest/MeshTest.cxx b/src/MeshTest/MeshTest.cxx index 95afd0eaaa..9882f52266 100644 --- a/src/MeshTest/MeshTest.cxx +++ b/src/MeshTest/MeshTest.cxx @@ -88,7 +88,8 @@ options:\n\ -surf_def_off disables control of deflection of mesh from real\n\ surface (enabled by default)\n\ -parallel enables parallel execution (switched off by default)\n\ - -adjust_min enables local adjustment of min size depending on edge size (switched off by default)\n"; + -adjust_min enables local adjustment of min size depending on edge size (switched off by default)\n\ + -force_face_def disables usage of shape tolerances for computing face deflection (switched off by default). \n"; return 0; } @@ -123,6 +124,8 @@ options:\n\ aMeshParams.ControlSurfaceDeflection = Standard_False; else if (aOpt == "-adjust_min") aMeshParams.AdjustMinSize = Standard_True; + else if (aOpt == "-force_face_def") + aMeshParams.ForceFaceDeflection = Standard_True; else if (i < nbarg) { Standard_Real aVal = Draw::Atof(argv[i++]); diff --git a/tests/bugs/mesh/bug31251 b/tests/bugs/mesh/bug31251 new file mode 100644 index 0000000000..242d2e13e1 --- /dev/null +++ b/tests/bugs/mesh/bug31251 @@ -0,0 +1,30 @@ +puts "=======" +puts "0031251: Mesh - Add a parameter for IncrementalMesh to ignore face tolerance for face deflection" +puts "=======" +puts "" + +pload XDE + +stepread [locate_data_file bug31251_Albatros_d2_elisa_a.STEP] a * +renamevar a_1 result + +vinit +vtop +vsetdispmode 1 +vdefaults -autoTriang 0 + +tclean result +incmesh result 0.004 -a 14 +checktrinfo result -tri 70560 -nod 39946 -defl 0.22962869401103247 + +vdisplay result -redisplay +vfit +checkview -screenshot -3d -path ${imagedir}/${test_image}_default.png + +tclean result +incmesh result 0.004 -a 14 -force_face_def +checktrinfo result -tri 292560 -nod 150946 -defl 0.04579460790575135 + +vdisplay result -redisplay +vfit +checkview -screenshot -3d -path ${imagedir}/${test_image}_tightfit.png