1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-16 10:54:53 +03:00

0024247: Wrong result obtained by General Fuse algorithm

v0.0

I. New features:
no new features

II. Changes:
II.1. class BOPAlgo_PaveFiller
   - method:
void BOPAlgo_PaveFiller::PerformFF()
Prepare data to the filter BOPAlgo_PaveFiller::::CheckPlanes(...).

   - method:
Standard_Boolean
  BOPAlgo_PaveFiller::CheckPlanes(const Standard_Integer nF1,
			  const Standard_Integer nF2)const
1)The contents of the filter has been updated by all vertices of the faces images.
2)The method declared as const

III. Modified entities:
packages:
BOPAlgo

Test cases for issue CR24247
This commit is contained in:
pkv 2013-10-17 12:17:35 +04:00 committed by bugmaster
parent 2b21c64155
commit af4e6dabcb
3 changed files with 74 additions and 97 deletions

View File

@ -363,7 +363,7 @@ is
-- Updates tolerance of vertex with index <nV>
-- to make it interfere with face with index <nF>
CheckPlanes(me:out;
CheckPlanes(me;
nF1 : Integer from Standard;
nF2 : Integer from Standard)
returns Boolean from Standard

View File

@ -121,6 +121,7 @@ void BOPAlgo_PaveFiller::PerformFF()
Standard_Integer nF1, nF2, aNbCurves, aNbPoints, iX, i, iP, iC, aNbLP;
Standard_Real aApproxTol, aTolR3D, aTolR2D, aTolFF;
BRepAdaptor_Surface aBAS1, aBAS2;
BOPCol_MapOfInteger aMI;
//
BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF();
aFFs.SetStartSize(iSize);
@ -149,6 +150,15 @@ void BOPAlgo_PaveFiller::PerformFF()
aBAS2.GetType() == GeomAbs_Plane) {
Standard_Boolean bToIntersect;
//
if (aMI.Add(nF1)) {
myDS->UpdateFaceInfoOn(nF1);
myDS->UpdateFaceInfoIn(nF1);
}
if (aMI.Add(nF2)) {
myDS->UpdateFaceInfoOn(nF2);
myDS->UpdateFaceInfoIn(nF2);
}
//
bToIntersect = CheckPlanes(nF1, nF2);
if (!bToIntersect) {
myDS->AddInterf(nF1, nF2);
@ -516,9 +526,8 @@ void BOPAlgo_PaveFiller::PerformFF()
//
Standard_Boolean bHasPaveBlocks, bOld;
Standard_Integer iErr, nSx, nVSD, iX, iP, iC, j, nV, iV = 0, iE, k;
Standard_Integer jx;
Standard_Integer jx, aNbLPBx;
Standard_Real aT;
Standard_Integer aNbLPBx;
TopAbs_ShapeEnum aType;
TopoDS_Shape aV, aE;
BOPCol_ListIteratorOfListOfShape aItLS;
@ -1964,91 +1973,42 @@ void BOPAlgo_PaveFiller::RemoveUsedVertices(BOPDS_Curve& aNC,
//function : CheckPlanes
//purpose :
//=======================================================================
Standard_Boolean BOPAlgo_PaveFiller::CheckPlanes(const Standard_Integer nF1,
const Standard_Integer nF2)
Standard_Boolean
BOPAlgo_PaveFiller::CheckPlanes(const Standard_Integer nF1,
const Standard_Integer nF2)const
{
Standard_Boolean bToIntersect;
//
bToIntersect = 1;
//
//1. Find shared vertices
Standard_Integer nS1, nS2, iCountV, iCountE;
BOPCol_MapOfInteger aMI1, aMI2;
Standard_Integer i, nV2, iCnt;
BOPCol_MapIteratorOfMapOfInteger aIt;
//
iCountV = 0;
iCountE = 0;
GetFullFaceMap(nF1, aMI1);
GetFullFaceMap(nF2, aMI2);
bToIntersect=Standard_False;
//
//1. Find shared sub shapes
aIt.Initialize(aMI1);
aIt.Next();
const BOPDS_FaceInfo& aFI1=myDS->ChangeFaceInfo(nF1);
const BOPDS_FaceInfo& aFI2=myDS->ChangeFaceInfo(nF2);
//
const BOPCol_MapOfInteger& aMVIn1=aFI1.VerticesIn();
const BOPCol_MapOfInteger& aMVOn1=aFI1.VerticesOn();
//
iCnt=0;
for (i=0; (i<2 && !bToIntersect); ++i) {
const BOPCol_MapOfInteger& aMV2=(!i) ? aFI2.VerticesIn()
: aFI2.VerticesOn();
//
aIt.Initialize(aMV2);
for (; aIt.More(); aIt.Next()) {
nS1 = aIt.Value();
if (aMI2.Contains(nS1)) {
const TopoDS_Shape& aS = myDS->Shape(nS1);
if (aS.ShapeType() == TopAbs_EDGE) {
++iCountE;
iCountV-=2;
} else {
++iCountV;
}
}
}
//
if ((iCountV + iCountE) > 1) {
return bToIntersect;
}
//
//2. Find intersecting sub shapes
Standard_Integer aNb, i, k;
BOPDS_VectorOfInterfEE& aEEs=myDS->InterfEE();
BOPDS_VectorOfInterfEF& aEFs=myDS->InterfEF();
for (k=0; k<2; ++k) {
aNb = !k ? aEEs.Extent() : aEFs.Extent();
for (i = 0; i < aNb; ++i) {
BOPDS_Interf *aInt = !k ? (BOPDS_Interf*) (&aEEs(i)) :
(BOPDS_Interf*) (&aEFs(i));
aInt->Indices(nS1, nS2);
if (aMI1.Contains(nS1) && aMI2.Contains(nS2) ||
aMI1.Contains(nS2) && aMI2.Contains(nS1)) {
const IntTools_CommonPrt& aCPart = !k ? aEEs(i).CommonPart() :
aEFs(i).CommonPart();
if (aCPart.Type() == TopAbs_EDGE) {
++iCountE;
} else {
++iCountV;
}
if ((iCountV + iCountE) > 1) {
return bToIntersect;
nV2=aIt.Value();
if (aMVIn1.Contains(nV2) || aMVOn1.Contains(nV2)) {
++iCnt;
if (iCnt>1) {
bToIntersect=!bToIntersect;
break;
}
}
}
}
//
BOPCol_MapOfInteger aMI;
//
for (k=0; k<2; ++k) {
aMI = !k ? aMI1 : aMI2;
nS2 = !k ? nF2 : nF1;
aIt.Initialize(aMI);
for (; aIt.More(); aIt.Next()) {
nS1 = aIt.Value();
const TopoDS_Shape& aV = myDS->Shape(nS1);
if (aV.ShapeType() == TopAbs_VERTEX) {
if (myDS->HasInterf(nS1, nS2) ||
myDS->HasInterfShapeSubShapes(nS1, nS2)) {
++iCountV;
}
}
}
}
bToIntersect = ((iCountV + iCountE) > 1);
//
return bToIntersect;
}
//=======================================================================
//function : ToleranceFF
//purpose : Computes the TolFF according to the tolerance value and
@ -2081,24 +2041,3 @@ Standard_Boolean BOPAlgo_PaveFiller::CheckPlanes(const Standard_Integer nF1,
aTolFF = Max(aTolFF, 5.e-6);
}
}
// DEB f
/*
{
BOPDS_DataMapIteratorOfDataMapOfShapeCoupleOfPaveBlocks aItx;
TopoDS_Compound aCx;
//
BRep_Builder aBBx;
aBBx.MakeCompound(aCx);
//
aItx.Initialize(theMSCPB);
for (; aItx.More(); aItx.Next()) {
const TopoDS_Shape& aSx=aItx.Key();
aBBx.Add(aCx, aSx);
}
int a=0;
BRepTools::Write(aCx, "cx");
}
*/
// DEB t

View File

@ -0,0 +1,38 @@
puts "========="
puts "OCC24247"
puts "========="
puts ""
###########################################################
# Wrong result obtained by General Fuse algorithm
###########################################################
restore [locate_data_file bug24247_Box.brep] b1
restore [locate_data_file bug24247_InsideBox.brep] b2
restore [locate_data_file bug24247_c1.brep] b3
restore [locate_data_file bug24247_c2.brep] b4
restore [locate_data_file bug24247_c3.brep] b5
restore [locate_data_file bug24247_plane_1.brep] b6
restore [locate_data_file bug24247_plane_2.brep] b7
restore [locate_data_file bug24247_plane_3.brep] b8
restore [locate_data_file bug24247_plane_4.brep] b9
bclearobjects
bcleartools
baddobjects b1 b2 b3 b4 b5 b6 b7 b8 b9
bfillds
bbuild result
set square 260611
set nb_v_good 44
set nb_e_good 108
set nb_w_good 74
set nb_f_good 74
set nb_sh_good 17
set nb_sol_good 17
set nb_compsol_good 0
set nb_compound_good 1
set nb_shape_good 335
set 2dviewer 1