Porting to new BOP

This commit is contained in:
vsr 2013-02-12 06:37:30 +00:00
parent c03ae2d3bc
commit 7e856e992d

View File

@ -317,180 +317,6 @@ Standard_Integer GEOMAlgo_AlgoTools::BuildPCurveForEdgeOnFace
//
return iRet;
}
//=======================================================================
//function :IsSplitToReverse
//purpose :
//=======================================================================
Standard_Boolean GEOMAlgo_AlgoTools::IsSplitToReverse(const TopoDS_Edge& theSplit,
const TopoDS_Edge& theEdge,
const Handle(BOPInt_Context)& theContext)
{
Standard_Boolean bRet, aFlag, bIsDegenerated;
Standard_Real aTE, aTS, aScPr, aTa, aTb, aT1, aT2;
TopAbs_Orientation aOrSr, aOrSp;
Handle(Geom_Curve) aCEdge, aCSplit;
gp_Vec aVE, aVS;
gp_Pnt aP;
//
bRet=Standard_False;
//
bIsDegenerated=(BRep_Tool::Degenerated(theSplit) ||
BRep_Tool::Degenerated(theEdge));
if (bIsDegenerated) {
return bRet;
}
//
aCEdge =BRep_Tool::Curve(theEdge , aT1, aT2);
aCSplit=BRep_Tool::Curve(theSplit, aTa, aTb);
//
if (aCEdge==aCSplit) {
aOrSr=theEdge.Orientation();
aOrSp=theSplit.Orientation();
bRet=(aOrSr!=aOrSp);
return bRet;
}
//
aTS=IntTools_Tools::IntermediatePoint(aTa, aTb);
aCSplit->D0(aTS, aP);
aFlag=BOPTools_AlgoTools2D::EdgeTangent(theSplit, aTS, aVS);
gp_Dir aDTS(aVS);
//
aFlag=theContext->ProjectPointOnEdge(aP, theEdge, aTE);
aFlag=BOPTools_AlgoTools2D::EdgeTangent(theEdge, aTE, aVE);
gp_Dir aDTE(aVE);
//
aScPr=aDTS*aDTE;
bRet=(aScPr<0.);
//
return bRet;
}
//=======================================================================
//function :IsSplitToReverse
//purpose :
//=======================================================================
Standard_Boolean GEOMAlgo_AlgoTools::IsSplitToReverse
(const TopoDS_Face& theFSp,
const TopoDS_Face& theFSr,
const Handle(BOPInt_Context)& theContext)
{
Standard_Boolean bRet, bFound, bInFace;
Standard_Real aT1, aT2, aT, aU, aV, aScPr;
gp_Pnt aPFSp, aPFSr;
gp_Dir aDNFSp;
gp_Vec aD1U, aD1V;
Handle(Geom_Surface) aSr, aSp;
TopAbs_Orientation aOrSr, aOrSp;
TopExp_Explorer anExp;
TopoDS_Edge aESp;
//
bRet=Standard_False;
//
aSr=BRep_Tool::Surface(theFSr);
aSp=BRep_Tool::Surface(theFSp);
if (aSr==aSp) {
aOrSr=theFSr.Orientation();
aOrSp=theFSp.Orientation();
bRet=(aOrSr!=aOrSp);
return bRet;
}
//
bFound=Standard_False;
anExp.Init(theFSp, TopAbs_EDGE);
for (; anExp.More(); anExp.Next()) {
aESp=TopoDS::Edge(anExp.Current());
if (!BRep_Tool::Degenerated(aESp)) {
if (!BRep_Tool::IsClosed(aESp, theFSp)) {
bFound=!bFound;
break;
}
}
}
//
if (!bFound) {
Standard_Boolean bFlag;
Standard_Integer iErr;
gp_Pnt2d aP2DFSp;
//
iErr=GEOMAlgo_AlgoTools::PntInFace(theFSp, aPFSp, aP2DFSp);
if (iErr) {
return bRet;
}
//
aP2DFSp.Coord(aU, aV);
bFlag=BOPTools_AlgoTools3D::GetNormalToSurface(aSp, aU, aV, aDNFSp);
if (!bFlag) {
return bRet;
}
}
else {
BRep_Tool::Range(aESp, aT1, aT2);
aT=IntTools_Tools::IntermediatePoint(aT1, aT2);
BOPTools_AlgoTools3D::GetApproxNormalToFaceOnEdge(aESp, theFSp, aT, aPFSp, aDNFSp);
}
//
// Parts of theContext.ComputeVS(..)
GeomAPI_ProjectPointOnSurf& aProjector=theContext->ProjPS(theFSr);
aProjector.Perform(aPFSp);
if (!aProjector.IsDone()) {
return bRet;
}
//
aProjector.LowerDistanceParameters(aU, aV);
gp_Pnt2d aP2D(aU, aV);
bInFace=theContext->IsPointInFace (theFSr, aP2D);
if (!bInFace) {
return bRet;
}
//
aSr->D1(aU, aV, aPFSr, aD1U, aD1V);
gp_Dir aDD1U(aD1U);
gp_Dir aDD1V(aD1V);
gp_Dir aDNFSr=aDD1U^aDD1V;
if (theFSr.Orientation()==TopAbs_REVERSED){
aDNFSr.Reverse();
}
//
aScPr=aDNFSp*aDNFSr;
bRet=(aScPr<0.);
//
return bRet;
}
//=======================================================================
// function: IsSplitToReverse
// purpose:
//=======================================================================
Standard_Boolean GEOMAlgo_AlgoTools::IsSplitToReverse
(const TopoDS_Shape& theSp,
const TopoDS_Shape& theSr,
const Handle(BOPInt_Context)& theCtx)
{
Standard_Boolean bRet;
TopAbs_ShapeEnum aType;
//
bRet=Standard_False;
//
aType=theSp.ShapeType();
switch (aType) {
case TopAbs_EDGE: {
const TopoDS_Edge& aESp=TopoDS::Edge(theSp);
const TopoDS_Edge& aESr=TopoDS::Edge(theSr);
bRet=GEOMAlgo_AlgoTools::IsSplitToReverse(aESp, aESr, theCtx);
}
break;
//
case TopAbs_FACE: {
const TopoDS_Face& aFSp=TopoDS::Face(theSp);
const TopoDS_Face& aFSr=TopoDS::Face(theSr);
bRet=GEOMAlgo_AlgoTools::IsSplitToReverse(aFSp, aFSr, theCtx);
}
break;
//
default:
break;
}
return bRet;
}
//////////////////////////////////////////////////////////////////////////
//=======================================================================
// function: MakeContainer
@ -594,10 +420,10 @@ void GEOMAlgo_AlgoTools::RefinePCurveForEdgeOnFace(const TopoDS_Edge& aE,
}
}
//=======================================================================
//function :IsSplitToReverse1
//function :IsSplitToReverse
//purpose :
//=======================================================================
Standard_Boolean GEOMAlgo_AlgoTools::IsSplitToReverse1
Standard_Boolean GEOMAlgo_AlgoTools::IsSplitToReverse
(const TopoDS_Edge& aEF1,
const TopoDS_Edge& aEF2,
const Handle(BOPInt_Context)& aContext)