increase minimum number of discretization points by one explicitly on each iteration of model healer to cover cases degenerated to line
//=======================================================================
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();
}
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();
}
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(),
//! 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 ();
const IMeshTools_Parameters& myParameters;
TopoDS_Edge myEdge;
BRepAdaptor_Curve myCurve;
+ Standard_Integer myMinPointsNb;
GCPnts_TangentialDeflection myDiscretTool;
TopoDS_Vertex myFirstVertex;
TopoDS_Vertex myLastVertex;
//=======================================================================
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);
}
//=======================================================================
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);
}
//=======================================================================
//! 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(
void operator()(const IMeshData::IEdgePtr& theDEdge) const
{
const IMeshData::IEdgeHandle aDEdge = theDEdge;
+
+ const Standard_Integer aPointsNb = aDEdge->GetCurve()->ParametersNb();
+
aDEdge->Clear(Standard_True);
aDEdge->SetDeflection(Max(aDEdge->GetDeflection() / 3., Precision::Confusion()));
const IMeshData::IFaceHandle aDFace = aPCurve->GetFace();
Handle(IMeshTools_CurveTessellator) aTessellator =
BRepMesh_EdgeDiscret::CreateEdgeTessellator(
- aDEdge, aPCurve->GetOrientation(), aDFace, myParameters);
+ aDEdge, aPCurve->GetOrientation(), aDFace,
+ myParameters, aPointsNb + 1);
BRepMesh_EdgeDiscret::Tessellate3d(aDEdge, aTessellator, Standard_False);
BRepMesh_EdgeDiscret::Tessellate2d(aDEdge, Standard_False);