mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-14 13:30:48 +03:00
0025044: BRepMesh tweaks - treatments for degenerated and tiny faces
BRepMesh_ModelHealer - recognize a small face with 1 wire and 2 small edges as a face for refinement. BRepMesh_DefaultRangeSplinner - reduce tolerance on tiny faces to improve the meshing results. Added new test cases: bugs mesh bug25044_*. Existing test cases updated to reflect improvements.
This commit is contained in:
@@ -126,8 +126,8 @@ void BRepMesh_DefaultRangeSplitter::computeTolerance(
|
||||
const Standard_Real aDiffV = myRangeV.second - myRangeV.first;
|
||||
|
||||
const Standard_Real aDeflectionUV = 1.e-05;
|
||||
myTolerance.first = Max(aDeflectionUV, Precision::Confusion() * aDiffU);
|
||||
myTolerance.second = Max(aDeflectionUV, Precision::Confusion() * aDiffV);
|
||||
myTolerance.first = Max(Min(aDeflectionUV, 0.1 * aDiffU), 1e-7 * aDiffU);
|
||||
myTolerance.second = Max(Min(aDeflectionUV, 0.1 * aDiffV), 1e-7 * aDiffV);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
|
@@ -245,6 +245,30 @@ void BRepMesh_ModelHealer::process(const IMeshData::IFaceHandle& theDFace) const
|
||||
#endif
|
||||
aIntersections = aChecker.GetIntersectingEdges();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (theDFace->WiresNb () == 1)
|
||||
{
|
||||
const IMeshData::IWireHandle& aDWire = theDFace->GetWire (0);
|
||||
|
||||
if (aDWire->EdgesNb () == 2)
|
||||
{
|
||||
const IMeshData::IEdgePtr& aDEdge0 = aDWire->GetEdge (0);
|
||||
const IMeshData::IEdgePtr& aDEdge1 = aDWire->GetEdge (1);
|
||||
|
||||
const IMeshData::IPCurveHandle& aPCurve0 = aDEdge0->GetPCurve (theDFace.get (), aDWire->GetEdgeOrientation (0));
|
||||
const IMeshData::IPCurveHandle& aPCurve1 = aDEdge1->GetPCurve (theDFace.get (), aDWire->GetEdgeOrientation (1));
|
||||
|
||||
if (aPCurve0->ParametersNb () == 2 && aPCurve1->ParametersNb () == 2)
|
||||
{
|
||||
aIntersections = new IMeshData::MapOfIEdgePtr;
|
||||
// a kind of degenerated face - 1 wire, 2 edges and both edges are very small
|
||||
aIntersections->Add (aDEdge0);
|
||||
aIntersections->Add (aDEdge1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Standard_Failure const&)
|
||||
|
Reference in New Issue
Block a user