From f73592edf0ad5231c84e5332c8c47f54ed178780 Mon Sep 17 00:00:00 2001 From: oan Date: Wed, 30 Oct 2019 12:08:19 +0300 Subject: [PATCH] 0028500: Artifact in shaded view of the shape 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). --- src/BRepMesh/BRepMesh_CurveTessellator.cxx | 15 ++++++++++----- src/BRepMesh/BRepMesh_CurveTessellator.hxx | 7 +++++-- src/BRepMesh/BRepMesh_EdgeDiscret.cxx | 12 +++++++----- src/BRepMesh/BRepMesh_EdgeDiscret.hxx | 6 ++++-- src/BRepMesh/BRepMesh_ModelHealer.cxx | 20 +++++++++++++++++++- tests/bugs/mesh/bug25044_12 | 3 --- tests/bugs/mesh/bug25044_13 | 3 --- tests/bugs/mesh/bug25044_60 | 3 +++ tests/bugs/mesh/bug28500 | 18 ++++++++---------- tests/bugs/mesh/bug32692_1 | 2 +- tests/hlr/poly_hlr/C3 | 2 +- tests/hlr/poly_hlr/bug23625_1 | 10 +--------- 12 files changed, 59 insertions(+), 42 deletions(-) diff --git a/src/BRepMesh/BRepMesh_CurveTessellator.cxx b/src/BRepMesh/BRepMesh_CurveTessellator.cxx index fbb1b47305..3779a52425 100644 --- a/src/BRepMesh/BRepMesh_CurveTessellator.cxx +++ b/src/BRepMesh/BRepMesh_CurveTessellator.cxx @@ -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(), diff --git a/src/BRepMesh/BRepMesh_CurveTessellator.hxx b/src/BRepMesh/BRepMesh_CurveTessellator.hxx index ddf3bcfa52..d9406a8423 100644 --- a/src/BRepMesh/BRepMesh_CurveTessellator.hxx +++ b/src/BRepMesh/BRepMesh_CurveTessellator.hxx @@ -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; diff --git a/src/BRepMesh/BRepMesh_EdgeDiscret.cxx b/src/BRepMesh/BRepMesh_EdgeDiscret.cxx index a68165a291..31c7963c59 100644 --- a/src/BRepMesh/BRepMesh_EdgeDiscret.cxx +++ b/src/BRepMesh/BRepMesh_EdgeDiscret.cxx @@ -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); } //======================================================================= diff --git a/src/BRepMesh/BRepMesh_EdgeDiscret.hxx b/src/BRepMesh/BRepMesh_EdgeDiscret.hxx index c8db5ec342..89b67eda39 100644 --- a/src/BRepMesh/BRepMesh_EdgeDiscret.hxx +++ b/src/BRepMesh/BRepMesh_EdgeDiscret.hxx @@ -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( diff --git a/src/BRepMesh/BRepMesh_ModelHealer.cxx b/src/BRepMesh/BRepMesh_ModelHealer.cxx index def938d41a..4c2eed209a 100644 --- a/src/BRepMesh/BRepMesh_ModelHealer.cxx +++ b/src/BRepMesh/BRepMesh_ModelHealer.cxx @@ -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); diff --git a/tests/bugs/mesh/bug25044_12 b/tests/bugs/mesh/bug25044_12 index 1ddf82927d..31d1c179ad 100644 --- a/tests/bugs/mesh/bug25044_12 +++ b/tests/bugs/mesh/bug25044_12 @@ -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 "=======" diff --git a/tests/bugs/mesh/bug25044_13 b/tests/bugs/mesh/bug25044_13 index f02bc31f58..12b8348b95 100644 --- a/tests/bugs/mesh/bug25044_13 +++ b/tests/bugs/mesh/bug25044_13 @@ -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 "=======" diff --git a/tests/bugs/mesh/bug25044_60 b/tests/bugs/mesh/bug25044_60 index 78ae386109..6c89250587 100644 --- a/tests/bugs/mesh/bug25044_60 +++ b/tests/bugs/mesh/bug25044_60 @@ -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 * diff --git a/tests/bugs/mesh/bug28500 b/tests/bugs/mesh/bug28500 index 3bab0b6875..56e1699978 100644 --- a/tests/bugs/mesh/bug28500 +++ b/tests/bugs/mesh/bug28500 @@ -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 diff --git a/tests/bugs/mesh/bug32692_1 b/tests/bugs/mesh/bug32692_1 index 5a85bff3db..1712b35ab1 100644 --- a/tests/bugs/mesh/bug32692_1 +++ b/tests/bugs/mesh/bug32692_1 @@ -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 diff --git a/tests/hlr/poly_hlr/C3 b/tests/hlr/poly_hlr/C3 index 6efe35f15c..b6806e8256 100644 --- a/tests/hlr/poly_hlr/C3 +++ b/tests/hlr/poly_hlr/C3 @@ -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 diff --git a/tests/hlr/poly_hlr/bug23625_1 b/tests/hlr/poly_hlr/bug23625_1 index 598634bec4..ed7a28c97a 100644 --- a/tests/hlr/poly_hlr/bug23625_1 +++ b/tests/hlr/poly_hlr/bug23625_1 @@ -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