0022771: [CEA 1311] Creating a smaller wire when using the function "Fuse Colinear Edges Within A Wire"

This commit is contained in:
skv 2015-02-24 12:54:42 +03:00
parent 3ddada8e52
commit 2c5180adf1
2 changed files with 53 additions and 2 deletions

View File

@ -37,6 +37,52 @@
#include <Precision.hxx>
#include <TColStd_ListIteratorOfListOfReal.hxx>
#include <IntRes2d_IntersectionSegment.hxx>
#include <TopExp.hxx>
/**
* This function returns Standard_True if it is possible to divide edge, i.e.
* if one parameter either start or end one is inside the edge. This function
* is used in the method GEOMImpl_Fillet1d::Result.
*
* \param theEdge the edge
* \param theStart the start parameter
* \param theEnd the end parameter
* \return Standard_True if it is possible to split edge;
* Standard_False otherwise.
*/
static Standard_Boolean IsDivideEdge(const TopoDS_Edge &theEdge,
const Standard_Real theStart,
const Standard_Real theEnd)
{
Standard_Real aFirst;
Standard_Real aLast;
Handle(Geom_Curve) aCurve = BRep_Tool::Curve(theEdge, aFirst, aLast);
gp_Pnt aPStart = aCurve->Value(theStart);
gp_Pnt aPEnd = aCurve->Value(theEnd);
TopoDS_Vertex aVFirst = TopExp::FirstVertex(theEdge);
TopoDS_Vertex aVLast = TopExp::FirstVertex(theEdge);
Standard_Real aTolFirst = BRep_Tool::Tolerance(aVFirst);
Standard_Real aTolLast = BRep_Tool::Tolerance(aVLast);
Standard_Real aTolConf = Precision::Confusion();
gp_Pnt aPFirst = BRep_Tool::Pnt(aVFirst);
gp_Pnt aPLast = BRep_Tool::Pnt(aVLast);
Standard_Real aDistSF = aPStart.Distance(aPFirst);
Standard_Real aDistSL = aPStart.Distance(aPLast);
Standard_Real aDistEF = aPEnd.Distance(aPFirst);
Standard_Real aDistEL = aPEnd.Distance(aPLast);
Standard_Boolean isSplit = Standard_True;
if (aDistSF <= aTolFirst + aTolConf ||
aDistSL <= aTolLast + aTolConf) {
if (aDistEF <= aTolFirst + aTolConf ||
aDistEL <= aTolLast + aTolConf) {
isSplit = Standard_False;
}
}
return isSplit;
}
/**
* class GEOMImpl_Fillet1d
@ -617,7 +663,7 @@ TopoDS_Edge GEOMImpl_Fillet1d::Result(const gp_Pnt& thePoint,
else
anEnd = aNearest->GetParam();
if (fabs(aStart - anEnd) > Precision::Confusion())
if (IsDivideEdge(myEdge1, aStart, anEnd))
{
//Divide edge
BRepBuilderAPI_MakeEdge aDivider1(aCurve, aStart, anEnd);
@ -636,7 +682,7 @@ TopoDS_Edge GEOMImpl_Fillet1d::Result(const gp_Pnt& thePoint,
else
anEnd = aNearest->GetParam2();
if (fabs(aStart - anEnd) > Precision::Confusion())
if (IsDivideEdge(myEdge2, aStart, anEnd))
{
BRepBuilderAPI_MakeEdge aDivider2(aCurve, aStart, anEnd);
if (myEdgesExchnged)

View File

@ -251,6 +251,11 @@ Standard_Integer GEOMImpl_Fillet1dDriver::Execute(TFunction_Logbook& log) const
MakeFillet(aWireNew, aVertexListNew, rad, isFinalPass, aResult);
}
if (!GEOMUtils::CheckShape(aResult, true) &&
!GEOMUtils::FixShapeTolerance(aResult)) {
Standard_ConstructionError::Raise("Non valid shape result");
}
aFunction->SetValue(aResult);
log.SetTouched(Label());