]> OCCT Git - occt.git/commitdiff
0028500: Artifact in shaded view of the shape
authoroan <oan@opencascade.com>
Wed, 30 Oct 2019 09:08:19 +0000 (12:08 +0300)
committersmoskvin <smoskvin@opencascade.com>
Mon, 31 Oct 2022 15:21:44 +0000 (18:21 +0300)
Increase minimum number of discretization points by one explicitly on each iteration of model healer to cover cases degenerated to line (for cases when face consists of 2 edges only).

12 files changed:
src/BRepMesh/BRepMesh_CurveTessellator.cxx
src/BRepMesh/BRepMesh_CurveTessellator.hxx
src/BRepMesh/BRepMesh_EdgeDiscret.cxx
src/BRepMesh/BRepMesh_EdgeDiscret.hxx
src/BRepMesh/BRepMesh_ModelHealer.cxx
tests/bugs/mesh/bug25044_12
tests/bugs/mesh/bug25044_13
tests/bugs/mesh/bug25044_60
tests/bugs/mesh/bug28500
tests/bugs/mesh/bug32692_1
tests/hlr/poly_hlr/C3
tests/hlr/poly_hlr/bug23625_1

index fbb1b4730566ba94ddad3986efdf04079a26e81e..3779a5242569d903a4a379d4714fcdb8d1fe40e0 100644 (file)
@@ -35,11 +35,13 @@ IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_CurveTessellator, IMeshTools_CurveTessellato
 //=======================================================================
 BRepMesh_CurveTessellator::BRepMesh_CurveTessellator(
   const IMeshData::IEdgeHandle& theEdge,
-  const IMeshTools_Parameters&  theParameters)
+  const IMeshTools_Parameters&  theParameters,
+  const Standard_Integer        theMinPointsNb)
   : myDEdge(theEdge),
     myParameters(theParameters),
     myEdge(theEdge->GetEdge()),
-    myCurve(myEdge)
+    myCurve(myEdge),
+    myMinPointsNb (theMinPointsNb)
 {
   init();
 }
@@ -52,11 +54,13 @@ BRepMesh_CurveTessellator::BRepMesh_CurveTessellator (
   const IMeshData::IEdgeHandle& theEdge,
   const TopAbs_Orientation      theOrientation,
   const IMeshData::IFaceHandle& theFace,
-  const IMeshTools_Parameters&  theParameters)
+  const IMeshTools_Parameters&  theParameters,
+  const Standard_Integer        theMinPointsNb)
   : myDEdge(theEdge),
     myParameters(theParameters),
     myEdge(TopoDS::Edge(theEdge->GetEdge().Oriented(theOrientation))),
-    myCurve(myEdge, theFace->GetFace())
+    myCurve(myEdge, theFace->GetFace()),
+    myMinPointsNb (theMinPointsNb)
 {
   init();
 }
@@ -97,7 +101,8 @@ void BRepMesh_CurveTessellator::init()
   myEdgeSqTol  = BRep_Tool::Tolerance (myEdge);
   myEdgeSqTol *= myEdgeSqTol;
 
-  const Standard_Integer aMinPntNb = (myCurve.GetType() == GeomAbs_Circle) ? 4 : 2; //OCC287
+  const Standard_Integer aMinPntNb = Max(myMinPointsNb,
+    (myCurve.GetType() == GeomAbs_Circle) ? 4 : 2); //OCC287
 
   myDiscretTool.Initialize (myCurve,
                             myCurve.FirstParameter(), myCurve.LastParameter(),
index ddf3bcfa525d214765d050ea591bc87ca7cb7667..d9406a842309f94096212a60f858953df1e89535 100644 (file)
@@ -34,14 +34,16 @@ public:
   //! Constructor.
   Standard_EXPORT BRepMesh_CurveTessellator(
     const IMeshData::IEdgeHandle& theEdge,
-    const IMeshTools_Parameters&  theParameters);
+    const IMeshTools_Parameters&  theParameters,
+    const Standard_Integer        theMinPointsNb = 2);
 
   //! Constructor.
   Standard_EXPORT BRepMesh_CurveTessellator (
     const IMeshData::IEdgeHandle& theEdge,
     const TopAbs_Orientation      theOrientation,
     const IMeshData::IFaceHandle& theFace,
-    const IMeshTools_Parameters&  theParameters);
+    const IMeshTools_Parameters&  theParameters,
+    const Standard_Integer        theMinPointsNb = 2);
 
   //! Destructor.
   Standard_EXPORT virtual ~BRepMesh_CurveTessellator ();
@@ -96,6 +98,7 @@ private:
   const IMeshTools_Parameters&  myParameters;
   TopoDS_Edge                   myEdge;
   BRepAdaptor_Curve             myCurve;
+  Standard_Integer              myMinPointsNb;
   GCPnts_TangentialDeflection   myDiscretTool;
   TopoDS_Vertex                 myFirstVertex;
   TopoDS_Vertex                 myLastVertex;
index a68165a291c1d714a1e148d387210845ea2c48c6..31c7963c5983f4d42d546aaf946d4bd7a68e4c97 100644 (file)
@@ -49,9 +49,10 @@ BRepMesh_EdgeDiscret::~BRepMesh_EdgeDiscret ()
 //=======================================================================
 Handle(IMeshTools_CurveTessellator) BRepMesh_EdgeDiscret::CreateEdgeTessellator(
   const IMeshData::IEdgeHandle& theDEdge,
-  const IMeshTools_Parameters&  theParameters)
+  const IMeshTools_Parameters&  theParameters,
+  const Standard_Integer        theMinPointsNb)
 {
-  return new BRepMesh_CurveTessellator(theDEdge, theParameters);
+  return new BRepMesh_CurveTessellator(theDEdge, theParameters, theMinPointsNb);
 }
 
 //=======================================================================
@@ -62,11 +63,12 @@ Handle(IMeshTools_CurveTessellator) BRepMesh_EdgeDiscret::CreateEdgeTessellator(
   const IMeshData::IEdgeHandle& theDEdge,
   const TopAbs_Orientation      theOrientation,
   const IMeshData::IFaceHandle& theDFace,
-  const IMeshTools_Parameters&  theParameters)
+  const IMeshTools_Parameters&  theParameters,
+  const Standard_Integer        theMinPointsNb)
 {
   return theDEdge->GetSameParam() ? 
-    new BRepMesh_CurveTessellator(theDEdge, theParameters) :
-    new BRepMesh_CurveTessellator(theDEdge, theOrientation, theDFace, theParameters);
+    new BRepMesh_CurveTessellator(theDEdge, theParameters, theMinPointsNb) :
+    new BRepMesh_CurveTessellator(theDEdge, theOrientation, theDFace, theParameters, theMinPointsNb);
 }
 
 //=======================================================================
index c8db5ec34203427f6c229e3ccab649122faeefd7..89b67eda394ed0b213f2e09372c1cc9e2c03b852 100644 (file)
@@ -38,14 +38,16 @@ public:
   //! Creates instance of free edge tessellator.
   Standard_EXPORT static Handle(IMeshTools_CurveTessellator) CreateEdgeTessellator(
     const IMeshData::IEdgeHandle& theDEdge,
-    const IMeshTools_Parameters&  theParameters);
+    const IMeshTools_Parameters&  theParameters,
+    const Standard_Integer        theMinPointsNb = 2);
 
   //! Creates instance of edge tessellator.
   Standard_EXPORT static Handle(IMeshTools_CurveTessellator) CreateEdgeTessellator(
     const IMeshData::IEdgeHandle& theDEdge,
     const TopAbs_Orientation      theOrientation,
     const IMeshData::IFaceHandle& theDFace,
-    const IMeshTools_Parameters&  theParameters);
+    const IMeshTools_Parameters&  theParameters,
+    const Standard_Integer        theMinPointsNb = 2);
 
   //! Creates instance of tessellation extractor.
   Standard_EXPORT static Handle(IMeshTools_CurveTessellator) CreateEdgeTessellationExtractor(
index def938d41a6de6cf6823ffb379da0c3d3f4d07d9..4c2eed209ac8e31e36cdf9bb5faadfd98c585e77 100644 (file)
@@ -50,14 +50,32 @@ namespace
     void operator()(const IMeshData::IEdgePtr& theDEdge) const
     {
       const IMeshData::IEdgeHandle aDEdge = theDEdge;
+
+      Standard_Integer aPointsNb = aDEdge->GetCurve()->ParametersNb();
+
       aDEdge->Clear(Standard_True);
       aDEdge->SetDeflection(Max(aDEdge->GetDeflection() / 3., Precision::Confusion()));
 
+      for (Standard_Integer aPCurveIt = 0; aPCurveIt < aDEdge->PCurvesNb(); ++aPCurveIt)
+      {
+        const IMeshData::IPCurveHandle& aPCurve = aDEdge->GetPCurve(aPCurveIt);
+        const IMeshData::IFaceHandle    aDFace  = aPCurve->GetFace();
+
+        // Check that outer wire contains 2 edges or less and add an additional point.
+        const IMeshData::IWireHandle&   aDWire  = aDFace->GetWire(0);
+        if (aDWire->EdgesNb() <= 2)
+        {
+          ++aPointsNb;
+          break;
+        }
+      }
+
       const IMeshData::IPCurveHandle& aPCurve = aDEdge->GetPCurve(0);
       const IMeshData::IFaceHandle    aDFace = aPCurve->GetFace();
       Handle(IMeshTools_CurveTessellator) aTessellator =
         BRepMesh_EdgeDiscret::CreateEdgeTessellator(
-          aDEdge, aPCurve->GetOrientation(), aDFace, myParameters);
+          aDEdge, aPCurve->GetOrientation(), aDFace,
+          myParameters, aPointsNb);
 
       BRepMesh_EdgeDiscret::Tessellate3d(aDEdge, aTessellator, Standard_False);
       BRepMesh_EdgeDiscret::Tessellate2d(aDEdge, Standard_False);
index 1ddf82927d8c7b5ff93f5ffd7a347ec4ae0d6b8c..31d1c179adb98951ed47bcd8bcc496144bf55e7d 100644 (file)
@@ -1,6 +1,3 @@
-puts "TODO 25044 ALL: SelfIntersectingWire"
-puts "TODO 25044 ALL: Number of triangles is equal to 0"
-
 puts "======="
 puts "0025044: BRepMesh tweaks"
 puts "======="
index f02bc31f583b537bdf1d0ca89f1beeae39912cb2..12b8348b95f55e479ef316d7e5deb4c95cc3c164 100644 (file)
@@ -1,6 +1,3 @@
-puts "TODO 25044 ALL: SelfIntersectingWire"
-puts "TODO 25044 ALL: Number of triangles is equal to 0"
-
 puts "======="
 puts "0025044: BRepMesh tweaks"
 puts "======="
index 78ae38610968b701b8a495a28ab2942cf802b354..6c892505875b0b384c4e477d77fcf387d0a15f20 100644 (file)
@@ -3,6 +3,9 @@ puts "0025588: BRepMesh_ShapeTool::FindUV check for 2d points to be the same is
 puts "======="
 puts ""
 
+puts "TODO OCC25588 All: Not connected mesh inside face 893"
+puts "TODO OCC25588 All: Not connected mesh inside face 1094"
+
 pload XDE
 
 stepread [locate_data_file Median_cx-fs01_bicycle.stp] a *
index 3bab0b6875e6cd13daf685f0d65d8312d4942cdb..56e1699978f81b434d17ddd1d0fcdda21ebd8e1f 100644 (file)
@@ -3,22 +3,20 @@ puts "CR28500: Artifact in shaded view of the shape"
 puts "======="
 puts ""
 
-puts "TODO CR28500 ALL: Artifact in shaded view of the shape"
-puts "TODO CR30056 ALL: Meshing statuses: SelfIntersectingWire Failure Reused"
+restore [locate_data_file bug28500_shape_mesh_artifact.brep] result
 
-restore [locate_data_file bug28500_shape_mesh_artifact.brep] a
-
-incmesh a 0.01
+tclean result
+incmesh result 0.01
 
 vinit
 vsetdispmode 1
-vdisplay a
+vdefaults -autoTriang 0 
+vdisplay result
 vfit
 
-set x 150
-set y 150
-if { [checkcolor $x $y 0 1 0] == 1 } {
-  puts "Error: Artifact in shaded view of the shape"
+set log [tricheck result]
+if { [llength $log] != 0 } {
+  puts "Error : Mesh contains faulties"
 }
 
 checkview -screenshot -3d -path ${imagedir}/${test_image}.png
index 5a85bff3db5fee40cb96a625d715c698dabde642..1712b35ab111ba637524b1378a157b6149f3ceb1 100644 (file)
@@ -8,4 +8,4 @@ puts "REQUIRED ALL: Meshing statuses: SelfIntersectingWire Failure"
 restore [locate_data_file bug32692.brep] s
 incmesh s 0.01 -parallel
 
-checktrinfo s -nod 7427 -tri 7457 -empty 9 -face 309
+checktrinfo s -nod 7389 -tri 7419 -empty 9 -face 309
index 6efe35f15c7d75075893a85057f71eb95cbdcd3f..b6806e82567edea0ffefe56a5098d6e5d9386e1e 100644 (file)
@@ -1,5 +1,5 @@
 set viewname "vright"
-set length 3059.05
+set length 3057.35
 
 testreadstep [locate_data_file bug27341_570-DWLNL-40-08-L_131LANG_16VERSATZ_DIN.stp] a
 COMPUTE_HLR $viewname $algotype
index 598634bec4288610799f2dcff52d91e45d90aa98..ed7a28c97a49a7cccb3e05a28264e692585d3333 100644 (file)
@@ -3,16 +3,8 @@ puts "OCC23625"
 puts "============"
 puts ""
 
-puts "REQUIRED All: Meshing statuses: SelfIntersectingWire Failure"
-
 set viewname "vfront"
-set length 26411.7
+set length 26411.2
 
 restore [locate_data_file bug23625_a1.brep] a
-
-# workaround bug 0031426 until fix
-vinit View1
-vdefaults -autoTriang 0
-incmesh a 7.6
-
 COMPUTE_HLR $viewname $algotype