1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +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

5
tests/boolean/bcut_complex/O7 Normal file → Executable file
View File

@ -1,8 +1,9 @@
puts "TODO #22911 ALL: Error : The $command is not valid. The area is 0."
puts "TODO #25937 ALL: Faulty shapes in variables faulty_1"
#puts "TODO #22911 ALL: Error : The $command is not valid. The area is 0."
restore [locate_data_file CTO908_topo108-o.brep] obj
restore [locate_data_file pro12903b.rle] out
bcut result obj out
set square 0
set square 281453

34
tests/bugs/modalg_6/bug25937_1 Executable file
View File

@ -0,0 +1,34 @@
puts "============"
puts "OCC25937"
puts "============"
puts ""
###############################
## Failed Cut Edge or Face by HalfSpace.
###############################
# Cut a wire by halfspace
plane h 0 0 0 1 0 0
mkface h h
halfspace h h 10 0 0
polyline a -10 -10 0 10 -10 0 10 10 0 -10 10 0 -10 -10 0
bop a h
bopcut result
set length 40.
set nbshapes_expected "
Number of shapes in shape
VERTEX : 4
EDGE : 3
WIRE : 1
FACE : 0
SHELL : 0
SOLID : 0
COMPSOLID : 0
COMPOUND : 1
SHAPE : 9
"
checknbshapes result -ref ${nbshapes_expected} -t -m "Result obtained by Cut a wire by halfspace"
set 3dviewer 1

36
tests/bugs/modalg_6/bug25937_2 Executable file
View File

@ -0,0 +1,36 @@
puts "============"
puts "OCC25937"
puts "============"
puts ""
###############################
## Failed Cut Edge or Face by HalfSpace.
###############################
# Cut a face by halfspace
plane h 0 0 0 1 0 0
mkface h h
halfspace h h 10 0 0
plane a 0 0 0 0 0 1
mkface a a -10 10 -10 10
bop a h
bopcut result
set length 60.
set square 200.
set nbshapes_expected "
Number of shapes in shape
VERTEX : 4
EDGE : 4
WIRE : 1
FACE : 1
SHELL : 1
SOLID : 0
COMPSOLID : 0
COMPOUND : 1
SHAPE : 12
"
checknbshapes result -ref ${nbshapes_expected} -t -m "Result obtained by Cut a wire by halfspace"
set 3dviewer 1

34
tests/bugs/modalg_6/bug25937_3 Executable file
View File

@ -0,0 +1,34 @@
puts "============"
puts "OCC25937"
puts "============"
puts ""
###############################
## Failed Cut Edge or Face by HalfSpace.
###############################
# Cut a solid by halfspace
plane h 0 0 0 1 0 0
mkface h h
halfspace h h 10 0 0
box a -10 -10 0 20 20 10
bop a h
bopcut result
set square 1000.
set nbshapes_expected "
Number of shapes in shape
VERTEX : 8
EDGE : 12
WIRE : 6
FACE : 6
SHELL : 1
SOLID : 1
COMPSOLID : 0
COMPOUND : 1
SHAPE : 35
"
checknbshapes result -ref ${nbshapes_expected} -t -m "Result obtained by Cut a wire by halfspace"
set 3dviewer 1