1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-09-08 14:17:06 +03:00

0025937: Failed Cut Edge or Face by HalfSpace.

Addressing the causes of warnings.

Test cases for issue CR25937
This commit is contained in:
pkv
2015-04-30 13:49:25 +03:00
committed by bugmaster
parent 5e18f91719
commit f47b8d2b37
8 changed files with 218 additions and 9 deletions

View File

@@ -480,6 +480,17 @@ void BOPAlgo_BuilderFace::PerformAreas()
//
myAreas.Clear();
//
if (myLoops.IsEmpty()) {
if (myContext->IsInfiniteFace(myFace)) {
aBB.MakeFace(aFace, aS, aLoc, aTol);
if (BRep_Tool::NaturalRestriction(myFace)) {
aBB.NaturalRestriction(aFace, Standard_True);
}
myAreas.Append(aFace);
}
return;
}
//
// 1. Growthes and Holes -> aDMISB: [Index/ShapeBox2D]
aIt1.Initialize(myLoops);
for (k=0 ; aIt1.More(); aIt1.Next(), ++k) {

View File

@@ -463,7 +463,17 @@ void BOPAlgo_BuilderSolid::PerformLoops()
// 1. Shells Usual
aIt.Initialize (myShapes);
for (; aIt.More(); aIt.Next()) {
const TopoDS_Shape& aF=aIt.Value();
const TopoDS_Face& aF=*((TopoDS_Face*)&aIt.Value());
if (myContext->IsInfiniteFace(aF)) {
TopoDS_Shell aSh;
BRep_Builder aBB;
//
aBB.MakeShell(aSh);
aBB.Add(aSh, aF);
myLoops.Append(aSh);
continue;
}
//
if (!myShapesToAvoid.Contains(aF)) {
aSSp.AddStartElement(aF);
}
@@ -511,9 +521,11 @@ void BOPAlgo_BuilderSolid::PerformLoops()
// c. add all edges that are not processed to myShapesToAvoid
aIt.Initialize (myShapes);
for (; aIt.More(); aIt.Next()) {
const TopoDS_Shape& aF=aIt.Value();
if (!aMP.Contains(aF)) {
myShapesToAvoid.Add(aF);
const TopoDS_Face& aF=*((TopoDS_Face*)&aIt.Value());
if (!myContext->IsInfiniteFace(aF)) {
if (!aMP.Contains(aF)) {
myShapesToAvoid.Add(aF);
}
}
}
//=================================================

View File

@@ -25,13 +25,15 @@ class Context from IntTools
uses
Box from Bnd,
Pnt2d from gp,
Pnt from gp,
State from TopAbs,
Curve from Geom,
ProjectPointOnCurve from GeomAPI,
ProjectPointOnSurf from GeomAPI,
Shape from TopoDS,
Vertex from TopoDS,
Face from TopoDS,
Edge from TopoDS,
@@ -300,7 +302,19 @@ is
--- Returns false if projection algorithm failed
--- other wiese returns true.
---
BndBox(me:mutable;
theS:Shape from TopoDS)
returns Box from Bnd;
---C++: return &
--- Returns a reference to boundong box
--- for given shape <theS>
---
IsInfiniteFace(me:mutable;
theFace:Face from TopoDS)
returns Boolean from Standard;
---Purpose: Returns true if the solid <theFace> has
-- infinite bounds
fields
myAllocator : BaseAllocator from BOPCol is protected;
myFClass2dMap:DataMapOfShapeAddress from BOPCol is protected;
@@ -309,7 +323,8 @@ fields
mySClassMap :DataMapOfShapeAddress from BOPCol is protected;
myProjPTMap :DataMapOfTransientAddress from BOPCol is protected;
myHatcherMap :DataMapOfShapeAddress from BOPCol is protected;
myProjSDataMap:DataMapOfShapeAddress from BOPCol is protected;
myProjSDataMap:DataMapOfShapeAddress from BOPCol is protected;
myBndBoxDataMap:DataMapOfShapeAddress from BOPCol is protected;
myCreateFlag :Integer from Standard is protected;
end Context;

View File

@@ -31,6 +31,7 @@
#include <BRep_Tool.hxx>
#include <BRepAdaptor_Surface.hxx>
#include <BRepBndLib.hxx>
#include <IntTools_Tools.hxx>
#include <IntTools_FClass2d.hxx>
@@ -56,6 +57,7 @@ IntTools_Context::IntTools_Context()
myProjPTMap(100, myAllocator),
myHatcherMap(100, myAllocator),
myProjSDataMap(100, myAllocator),
myBndBoxDataMap(100, myAllocator),
myCreateFlag(0)
{
}
@@ -74,6 +76,7 @@ IntTools_Context::IntTools_Context
myProjPTMap(100, myAllocator),
myHatcherMap(100, myAllocator),
myProjSDataMap(100, myAllocator),
myBndBoxDataMap(100, myAllocator),
myCreateFlag(1)
{
}
@@ -158,6 +161,69 @@ IntTools_Context::~IntTools_Context()
myAllocator->Free(anAdr);
}
myProjSDataMap.Clear();
//
Bnd_Box* pBox;
aIt.Initialize(myBndBoxDataMap);
for (; aIt.More(); aIt.Next()) {
anAdr=aIt.Value();
pBox=(Bnd_Box*)anAdr;
(*pBox).~Bnd_Box();
myAllocator->Free(anAdr);
}
myBndBoxDataMap.Clear();
}
//=======================================================================
//function : BndBox
//purpose :
//=======================================================================
Bnd_Box& IntTools_Context::BndBox(const TopoDS_Shape& aS)
{
Standard_Address anAdr;
Bnd_Box* pBox;
//
if (!myBndBoxDataMap.IsBound(aS)) {
//
pBox=(Bnd_Box*)myAllocator->Allocate(sizeof(Bnd_Box));
new (pBox) Bnd_Box();
//
Bnd_Box &aBox=*pBox;
BRepBndLib::Add(aS, aBox);
//
anAdr=(Standard_Address)pBox;
myBndBoxDataMap.Bind(aS, anAdr);
}
else {
anAdr=myBndBoxDataMap.Find(aS);
pBox=(Bnd_Box*)anAdr;
}
return *pBox;
}
//=======================================================================
//function : IsInfiniteFace
//purpose :
//=======================================================================
Standard_Boolean IntTools_Context::IsInfiniteFace
(const TopoDS_Face& aFace)
{
Standard_Boolean bRet;
Standard_Integer i;
Standard_Real aX[6];
//
bRet=Standard_False;
//
if (!BRep_Tool::NaturalRestriction(aFace)) {
return bRet;
}
//
Bnd_Box& aBox=BndBox(aFace);
//
aBox.Get(aX[0], aX[1], aX[2], aX[3], aX[4], aX[5]);
//
for (i=0; (i<6) && (!bRet); ++i) {
bRet=Precision::IsInfinite(aX[i]);
}
//
return bRet;
}
//=======================================================================
//function : FClass2d