1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +03:00

0028683: Wrong result of CUT operation

1. Partial porting of the patches for the issues #0026738 and #0028017:
   Careful treatment of the SD vertices created on the Face/Face intersection stage.

2. Avoid creation of the small section edges.

3. Test case for the issue.

4. Adjusting test cases for current behavior.
This commit is contained in:
emv
2017-04-27 16:50:31 +03:00
parent 52e7e5b5fd
commit ece2d8b143
11 changed files with 340 additions and 193 deletions

View File

@@ -124,6 +124,11 @@ is
TreatVerticesEE(me:out)
is protected;
MakeSDVerticesFF(me:out;
theDMVLV: DataMapOfIntegerListOfInteger from BOPCol;
theDMNewSD: out DataMapOfIntegerInteger from BOPCol)
is protected;
MakeSplitEdges(me:out)
is protected;
@@ -132,7 +137,13 @@ is
MakePCurves(me:out)
is protected;
MakeSDVertices(me:out;
theVertIndices : ListOfInteger from BOPCol;
theAddInterfs : Boolean from Standard = Standard_True)
returns Integer from Standard
is protected;
ProcessDE(me:out)
is protected;
@@ -180,7 +191,8 @@ is
nF2 : Integer from Standard;
theMI : MapOfInteger from BOPCol;
theMVEF : MapOfInteger from BOPCol;
theMVTol : out DataMapOfIntegerReal from BOPCol)
theMVTol : out DataMapOfIntegerReal from BOPCol;
aDMVLV : out DataMapOfIntegerListOfInteger from BOPCol)
is protected;
---Purpose:
-- Checks and puts paves from <theMVOn> on the curve <theNC>.
@@ -271,7 +283,8 @@ is
theNC : out Curve from BOPDS;
theMI : MapOfInteger from BOPCol;
theMVEF : MapOfInteger from BOPCol;
theMVTol : out DataMapOfIntegerReal from BOPCol)
theMVTol : out DataMapOfIntegerReal from BOPCol;
aDMVLV : out DataMapOfIntegerListOfInteger from BOPCol)
is protected;
---Purpose:
-- Checks and puts paves created in EF intersections on the curve <theNC>.
@@ -282,7 +295,8 @@ is
theMI : MapOfInteger from BOPCol;
theNC : out Curve from BOPDS;
theMVStick : MapOfInteger from BOPCol;
theMVTol : out DataMapOfIntegerReal from BOPCol)
theMVTol : out DataMapOfIntegerReal from BOPCol;
aDMVLV : out DataMapOfIntegerListOfInteger from BOPCol)
is protected;
---Purpose:
-- Puts stick paves on the curve <theNC>
@@ -323,6 +337,7 @@ is
theNC : out Curve from BOPDS;
theMI : MapOfInteger from BOPCol;
theMVTol : out DataMapOfIntegerReal from BOPCol;
aDMVLV : out DataMapOfIntegerListOfInteger from BOPCol;
aType : Integer from Standard = 0)
is protected;
---Purpose:
@@ -378,12 +393,6 @@ is
is protected;
---Purpose:
-- Keeps data for post treatment
RefineFaceInfoOn(me:out)
is protected;
---Purpose:
-- Refines the state On for the all faces having
-- state information
UpdateFaceInfo(me:out;
theDME:out DataMapOfPaveBlockListOfPaveBlock from BOPDS)

View File

@@ -254,7 +254,8 @@ void BOPAlgo_PaveFiller::Perform()
return;
}
//
RefineFaceInfoOn();
myDS->ReleasePaveBlocks();
myDS->RefineFaceInfoOn();
//
MakePCurves();
if (myErrorStatus) {

View File

@@ -22,6 +22,10 @@
#include <Bnd_Box.hxx>
#include <BRep_TVertex.hxx>
#include <BRep_Tool.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Vertex.hxx>
#include <BRepBndLib.hxx>
@@ -43,15 +47,11 @@
// function: PerformVV
// purpose:
//=======================================================================
void BOPAlgo_PaveFiller::PerformVV()
void BOPAlgo_PaveFiller::PerformVV()
{
Standard_Boolean bWithSubShape;
Standard_Integer n1, n2, iFlag, nX, n, aSize, i, j, iX, k, aNbBlocks;
Standard_Integer n1, n2, iFlag, aSize, k, aNbBlocks;
Handle(NCollection_IncAllocator) aAllocator;
//BOPCol_DataMapIteratorOfDataMapOfIntegerListOfInteger aItMILI;
BOPCol_ListIteratorOfListOfInteger aItLI, aItLI2;
TopoDS_Vertex aVn;
BOPDS_ShapeInfo aSIn;
//
myErrorStatus=0;
//
@@ -61,8 +61,6 @@ void BOPAlgo_PaveFiller::PerformVV()
return;
}
//
aSIn.SetShapeType(TopAbs_VERTEX);
BOPDS_VectorOfInterfVV& aVVs=myDS->InterfVV();
aVVs.SetStartSize(aSize);
aVVs.SetIncrement(aSize);
@@ -72,7 +70,6 @@ void BOPAlgo_PaveFiller::PerformVV()
aAllocator=new NCollection_IncAllocator();
BOPCol_IndexedDataMapOfIntegerListOfInteger aMILI(100, aAllocator);
BOPCol_DataMapOfIntegerListOfInteger aMBlocks(100, aAllocator);
BOPCol_ListOfShape aLV(aAllocator);
//
// 1. Map V/LV
for (; myIterator->More(); myIterator->Next()) {
@@ -95,43 +92,7 @@ void BOPAlgo_PaveFiller::PerformVV()
for (k=0; k<aNbBlocks; ++k) {
const BOPCol_ListOfInteger& aLI=aMBlocks.Find(k);
//
aLV.Clear();
aItLI.Initialize(aLI);
for (; aItLI.More(); aItLI.Next()) {
nX=aItLI.Value();
const TopoDS_Shape& aV=myDS->Shape(nX);
aLV.Append(aV);
}
//
BOPTools_AlgoTools::MakeVertex(aLV, aVn);
//
// Append new vertex to the DS
aSIn.SetShape(aVn);
n=myDS->Append(aSIn);
//
BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(n);
Bnd_Box& aBox=aSIDS.ChangeBox();
BRepBndLib::Add(aVn, aBox);
//
// Fill ShapesSD
aItLI.Initialize(aLI);
for (i=0; aItLI.More(); aItLI.Next(), ++i) {
n1=aItLI.Value();
myDS->AddShapeSD(n1, n);
//
aItLI2.Initialize(aLI);
for (j=0; aItLI2.More(); aItLI2.Next(), ++j) {
if (j>i) {
n2=aItLI2.Value();
//
myDS->AddInterf(n1, n2);
iX=aVVs.Append()-1;
BOPDS_InterfVV& aVV=aVVs(iX);
aVV.SetIndices(n1, n2);
aVV.SetIndexNew(n);
}
}
}
MakeSDVertices(aLI);
}
//
BOPCol_DataMapIteratorOfDataMapOfIntegerInteger aItDMII;
@@ -144,8 +105,84 @@ void BOPAlgo_PaveFiller::PerformVV()
}
//
//-----------------------------------------------------scope t
aLV.Clear();
aMBlocks.Clear();
aMILI.Clear();
aAllocator.Nullify();
}
//=======================================================================
// function: MakeSDVertices
// purpose:
//=======================================================================
Standard_Integer BOPAlgo_PaveFiller::MakeSDVertices
(const BOPCol_ListOfInteger& theVertIndices,
const Standard_Boolean theAddInterfs)
{
TopoDS_Vertex aVSD, aVn;
Standard_Integer nSD = -1;
BOPCol_ListIteratorOfListOfInteger aItLI(theVertIndices);
BOPCol_ListOfShape aLV;
for (; aItLI.More(); aItLI.Next()) {
Standard_Integer nX = aItLI.Value(), nSD1;
if (myDS->HasShapeSD(nX, nSD1)) {
const TopoDS_Shape& aVSD1 = myDS->Shape(nSD1);
if (nSD == -1) {
aVSD = TopoDS::Vertex(aVSD1);
nSD = nSD1;
}
else {
aLV.Append(aVSD1);
}
}
const TopoDS_Shape& aV = myDS->Shape(nX);
aLV.Append(aV);
}
BOPTools_AlgoTools::MakeVertex(aLV, aVn);
Standard_Integer nV;
if (nSD != -1) {
// update old SD vertex with new value
Handle(BRep_TVertex)& aTVertex =
reinterpret_cast<Handle(BRep_TVertex)&>(const_cast<Handle(TopoDS_TShape)&>(aVSD.TShape()));
aTVertex->Pnt(BRep_Tool::Pnt(aVn));
aTVertex->Tolerance(BRep_Tool::Tolerance(aVn));
aVn = aVSD;
nV = nSD;
}
else {
// Append new vertex to the DS
BOPDS_ShapeInfo aSIn;
aSIn.SetShapeType(TopAbs_VERTEX);
aSIn.SetShape(aVn);
nV = myDS->Append(aSIn);
}
BOPDS_ShapeInfo& aSIDS = myDS->ChangeShapeInfo(nV);
Bnd_Box& aBox = aSIDS.ChangeBox();
BRepBndLib::Add(aVn, aBox);
aBox.SetGap(aBox.GetGap());
//
// Fill ShapesSD
BOPDS_VectorOfInterfVV& aVVs = myDS->InterfVV();
if (theAddInterfs)
aVVs.SetIncrement(theVertIndices.Extent());
//
aItLI.Initialize(theVertIndices);
for (; aItLI.More(); aItLI.Next()) {
Standard_Integer n1 = aItLI.Value();
myDS->AddShapeSD(n1, nV);
//
if (theAddInterfs) {
BOPCol_ListIteratorOfListOfInteger aItLI2 = aItLI;
aItLI2.Next();
for (; aItLI2.More(); aItLI2.Next()) {
Standard_Integer n2 = aItLI2.Value();
//
myDS->AddInterf(n1, n2);
//
Standard_Integer iX = aVVs.Append() - 1;
BOPDS_InterfVV& aVV = aVVs(iX);
aVV.SetIndices(n1, n2);
aVV.SetIndexNew(nV);
}
}
}
return nV;
}

View File

@@ -312,8 +312,6 @@ void BOPAlgo_PaveFiller::PerformEF()
nF=aItMI.Value();
myDS->UpdateFaceInfoIn(nF);
}
// Refine FaceInfoOn to remove all formal pave blocks
// made during EF processing
//-----------------------------------------------------scope t
aMIEFC.Clear();
aMVCPB.Clear();

View File

@@ -62,6 +62,7 @@
#include <BOPCol_ListOfInteger.hxx>
#include <BOPCol_IndexedMapOfInteger.hxx>
#include <BOPCol_DataMapOfIntegerReal.hxx>
#include <BOPCol_MapOfShape.hxx>
#include <BOPInt_Context.hxx>
#include <BOPInt_Tools.hxx>
@@ -292,7 +293,8 @@ void BOPAlgo_PaveFiller::MakeBlocks()
BOPDS_DataMapOfPaveBlockListOfPaveBlock aDMExEdges(100, aAllocator);
BOPCol_DataMapOfIntegerReal aMVTol(100, aAllocator);
BOPCol_DataMapIteratorOfDataMapOfIntegerReal aItMV;
BOPCol_DataMapOfIntegerInteger aDMI(100, aAllocator);
BOPCol_DataMapOfIntegerInteger aDMNewSD(100, aAllocator);
BOPCol_DataMapOfIntegerListOfInteger aDMVLV;
//
for (i=0; i<aNbFF; ++i) {
BOPDS_InterfFF& aFF=aFFs(i);
@@ -360,12 +362,12 @@ void BOPAlgo_PaveFiller::MakeBlocks()
// DEBt
aNC.InitPaveBlock1();
//
PutPavesOnCurve(aMVOnIn, aTolR3D, aNC, nF1, nF2, aMI, aMVEF, aMVTol);
PutPavesOnCurve(aMVOnIn, aTolR3D, aNC, nF1, nF2, aMI, aMVEF, aMVTol, aDMVLV);
//
PutStickPavesOnCurve(aF1, aF2, aMI, aNC, aMVStick, aMVTol);
PutStickPavesOnCurve(aF1, aF2, aMI, aNC, aMVStick, aMVTol, aDMVLV);
//904/F7
if (aNbC == 1) {
PutEFPavesOnCurve(aNC, aMI, aMVEF, aMVTol);
PutEFPavesOnCurve(aNC, aMI, aMVEF, aMVTol, aDMVLV);
}
//
if (aIC.HasBounds()) {
@@ -472,25 +474,32 @@ void BOPAlgo_PaveFiller::MakeBlocks()
aLPBC.RemoveFirst();
}//for (j=0; j<aNbC; ++j) {
//back to previous tolerance values for unused vertices
{
BRep_Builder aBB;
aItMV.Initialize(aMVTol);
for (; aItMV.More(); aItMV.Next()) {
nV1 = aItMV.Key();
aTol = aItMV.Value();
//
aItMV.Initialize(aMVTol);
for (; aItMV.More(); aItMV.Next()) {
nV1 = aItMV.Key();
aTol = aItMV.Value();
//
const TopoDS_Vertex& aV = *(TopoDS_Vertex*)&myDS->Shape(nV1);
//
aBB.UpdateVertex(aV, aTol);
}
const TopoDS_Vertex& aV = *(TopoDS_Vertex*)&myDS->Shape(nV1);
const Handle(BRep_TVertex)& TV =
*((Handle(BRep_TVertex)*)&aV.TShape());
TV->Tolerance(aTol);
// reset bnd box
BOPDS_ShapeInfo& aSIDS = myDS->ChangeShapeInfo(nV1);
Bnd_Box& aBoxDS = aSIDS.ChangeBox();
aBoxDS = Bnd_Box();
BRepBndLib::Add(aV, aBoxDS);
aBoxDS.SetGap(aBoxDS.GetGap() + Precision::Confusion());
//
if (aDMVLV.IsBound(nV1))
aDMVLV.UnBind(nV1);
}
//
ProcessExistingPaveBlocks(i, aMPBOnIn, aMSCPB, aMVI, aMVB, aMPBAdd);
}//for (i=0; i<aNbFF; ++i) {
//
// post treatment
myErrorStatus=PostTreatFF(aMSCPB, aMVI, aDMExEdges, aDMI, aAllocator);
MakeSDVerticesFF(aDMVLV, aDMNewSD);
myErrorStatus=PostTreatFF(aMSCPB, aMVI, aDMExEdges, aDMNewSD, aAllocator);
if (myErrorStatus) {
return;
}
@@ -498,7 +507,7 @@ void BOPAlgo_PaveFiller::MakeBlocks()
// update face info
UpdateFaceInfo(aDMExEdges);
//Update all pave blocks
UpdatePaveBlocks(aDMI);
UpdatePaveBlocks(aDMNewSD);
//-----------------------------------------------------scope t
aMF.Clear();
aMVStick.Clear();
@@ -506,10 +515,34 @@ void BOPAlgo_PaveFiller::MakeBlocks()
aMVOnIn.Clear();
aDMExEdges.Clear();
aMI.Clear();
aDMI.Clear();
aDMNewSD.Clear();
aAllocator.Nullify();
}
//=======================================================================
//function : MakeSDVerticesFF
//purpose :
//=======================================================================
void BOPAlgo_PaveFiller::MakeSDVerticesFF
(const BOPCol_DataMapOfIntegerListOfInteger& theDMVLV,
BOPCol_DataMapOfIntegerInteger& theDMNewSD)
{
// Create a new SD vertex for each group of coinciding vertices
// and put new substitutions to theDMNewSD.
BOPCol_DataMapIteratorOfDataMapOfIntegerListOfInteger aItG(theDMVLV);
for (; aItG.More(); aItG.Next()) {
const BOPCol_ListOfInteger& aList = aItG.Value();
// make SD vertices w/o creation of interfs
Standard_Integer nSD = MakeSDVertices(aList, Standard_False);
// update theDMNewSD
BOPCol_ListIteratorOfListOfInteger aItL(aList);
for (; aItL.More(); aItL.Next()) {
Standard_Integer nV = aItL.Value();
theDMNewSD.Bind(nV, nSD);
}
}
}
//=======================================================================
//function : PostTreatFF
//purpose :
@@ -518,7 +551,7 @@ Standard_Integer BOPAlgo_PaveFiller::PostTreatFF
(BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMSCPB,
BOPCol_DataMapOfShapeInteger& aMVI,
BOPDS_DataMapOfPaveBlockListOfPaveBlock& aDMExEdges,
BOPCol_DataMapOfIntegerInteger& aDMI,
BOPCol_DataMapOfIntegerInteger& aDMNewSD,
Handle(NCollection_BaseAllocator)& theAllocator)
{
Standard_Integer iRet, aNbS;
@@ -589,9 +622,25 @@ Standard_Integer BOPAlgo_PaveFiller::PostTreatFF
}
//
// 1 prepare arguments
BOPCol_MapOfShape anAddedSD;
for (k=1; k<=aNbS; ++k) {
const TopoDS_Shape& aS=theMSCPB.FindKey(k);
aLS.Append(aS);
// add vertices-candidates for SD from the map aDMNewSD,
// so that they took part in fuse operation.
TopoDS_Iterator itV(aS);
for (; itV.More(); itV.Next()) {
const TopoDS_Shape& aVer = itV.Value();
Standard_Integer iVer = aMVI.Find(aVer);
if (aDMNewSD.IsBound(iVer)) {
Standard_Integer iSD = aDMNewSD.Find(iVer);
const TopoDS_Shape& aVSD = myDS->Shape(iSD);
if (anAddedSD.Add(aVSD)) {
aLS.Append(aVSD);
aMVI.Bind(aVSD, iSD);
}
}
}
}
//
// 2 Fuse shapes
@@ -613,6 +662,8 @@ Standard_Integer BOPAlgo_PaveFiller::PostTreatFF
aType=aSIx.ShapeType();
//
if (aType==TopAbs_VERTEX) {
Standard_Boolean bIntersectionPoint = theMSCPB.Contains(aSx);
//
if (aPDS->HasShapeSD(nSx, nVSD)) {
aV=aPDS->Shape(nVSD);
}
@@ -630,14 +681,23 @@ Standard_Integer BOPAlgo_PaveFiller::PostTreatFF
else {
iV=aMVI.Find(aV);
}
// update FF interference
const BOPDS_CoupleOfPaveBlocks &aCPB=theMSCPB.FindFromKey(aSx);
iX=aCPB.IndexInterf();
iP=aCPB.Index();
BOPDS_InterfFF& aFF=aFFs(iX);
BOPDS_VectorOfPoint& aVNP=aFF.ChangePoints();
BOPDS_Point& aNP=aVNP(iP);
aNP.SetIndex(iV);
//
if (!bIntersectionPoint) {
// save SD connection
nSx = aMVI.Find(aSx);
aDMNewSD.Bind(nSx, iV);
myDS->AddShapeSD(nSx, iV);
}
else {
// update FF interference
const BOPDS_CoupleOfPaveBlocks &aCPB=theMSCPB.FindFromKey(aSx);
iX=aCPB.IndexInterf();
iP=aCPB.Index();
BOPDS_InterfFF& aFF=aFFs(iX);
BOPDS_VectorOfPoint& aVNP=aFF.ChangePoints();
BOPDS_Point& aNP=aVNP(iP);
aNP.SetIndex(iV);
}
}//if (aType==TopAbs_VERTEX) {
//
else if (aType==TopAbs_EDGE) {
@@ -689,24 +749,7 @@ Standard_Integer BOPAlgo_PaveFiller::PostTreatFF
}
}
//
if (!aNbLPBx) {
aE=aSx;
//
if (!aMVI.IsBound(aE)) {
aSI.SetShapeType(aType);
aSI.SetShape(aE);
iE=myDS->Append(aSI);
aMVI.Bind(aE, iE);
}
else {
iE=aMVI.Find(aE);
}
// append new PaveBlock to aLPBC
aPB1->SetEdge(iE);
aLPBC.Append(aPB1);
} // if (!aNbLPBx) {
//
else {
if (aNbLPBx) {
aItLPB.Initialize(aLPBx);
if (bOld) {
aPave1[0] = aPB1->Pave1();
@@ -749,7 +792,7 @@ Standard_Integer BOPAlgo_PaveFiller::PostTreatFF
}
const BOPDS_Pave& aP1 = !j ? aPB1->Pave1() : aPB1->Pave2();
if (aP1.Parameter() == aPave[j].Parameter() && aP1.Index() != iV) {
aDMI.Bind(aP1.Index(), iV);
aDMNewSD.Bind(aP1.Index(), iV);
}
//
aPave[j].SetIndex(iV);
@@ -785,6 +828,17 @@ Standard_Integer BOPAlgo_PaveFiller::PostTreatFF
}
}//else if (aType==TopAbs_EDGE)
}//for (; aItLS.More(); aItLS.Next()) {
//
// Update SD for vertices that did not participate in operation
BOPCol_DataMapOfIntegerInteger::Iterator itDM(aDMNewSD);
for (; itDM.More(); itDM.Next())
{
if (aDMNewSD.IsBound(itDM.Value())) {
Standard_Integer iSD = aDMNewSD.Find(itDM.Value());
itDM.ChangeValue() = iSD;
myDS->AddShapeSD(itDM.Key(), iSD);
}
}
return iRet;
}
@@ -1153,7 +1207,8 @@ void BOPAlgo_PaveFiller::PutPavesOnCurve
const Standard_Integer nF2,
const BOPCol_MapOfInteger& aMI,
const BOPCol_MapOfInteger& aMVEF,
BOPCol_DataMapOfIntegerReal& aMVTol)
BOPCol_DataMapOfIntegerReal& aMVTol,
BOPCol_DataMapOfIntegerListOfInteger& aDMVLV)
{
Standard_Boolean bInBothFaces;
Standard_Integer nV;
@@ -1165,7 +1220,7 @@ void BOPAlgo_PaveFiller::PutPavesOnCurve
aIt.Initialize(aMVEF);
for (; aIt.More(); aIt.Next()) {
nV=aIt.Value();
PutPaveOnCurve(nV, aTolR3D, aNC, aMI, aMVTol, 2);
PutPaveOnCurve(nV, aTolR3D, aNC, aMI, aMVTol, aDMVLV, 2);
}
//Put all other vertices
aIt.Initialize(aMVOnIn);
@@ -1194,7 +1249,7 @@ void BOPAlgo_PaveFiller::PutPavesOnCurve
}
}
//
PutPaveOnCurve(nV, aTolR3D, aNC, aMI, aMVTol, 1);
PutPaveOnCurve(nV, aTolR3D, aNC, aMI, aMVTol, aDMVLV, 1);
}
}
@@ -1342,7 +1397,8 @@ void BOPAlgo_PaveFiller::PutEFPavesOnCurve
(BOPDS_Curve& aNC,
const BOPCol_MapOfInteger& aMI,
const BOPCol_MapOfInteger& aMVEF,
BOPCol_DataMapOfIntegerReal& aMVTol)
BOPCol_DataMapOfIntegerReal& aMVTol,
BOPCol_DataMapOfIntegerListOfInteger& aDMVLV)
{
if (!aMVEF.Extent()) {
return;
@@ -1380,7 +1436,7 @@ void BOPAlgo_PaveFiller::PutEFPavesOnCurve
Standard_Integer aNbPoints = aProjPT.NbPoints();
if (aNbPoints) {
aDist = aProjPT.LowerDistance();
PutPaveOnCurve(nV, aDist, aNC, aMI, aMVTol);
PutPaveOnCurve(nV, aDist, aNC, aMI, aMVTol, aDMVLV);
}
}
}
@@ -1395,7 +1451,8 @@ void BOPAlgo_PaveFiller::PutStickPavesOnCurve
const BOPCol_MapOfInteger& aMI,
BOPDS_Curve& aNC,
const BOPCol_MapOfInteger& aMVStick,
BOPCol_DataMapOfIntegerReal& aMVTol)
BOPCol_DataMapOfIntegerReal& aMVTol,
BOPCol_DataMapOfIntegerListOfInteger& aDMVLV)
{
BOPCol_MapOfInteger aMV;
aMV.Assign(aMVStick);
@@ -1468,7 +1525,7 @@ void BOPAlgo_PaveFiller::PutStickPavesOnCurve
// The intersection curve aIC is vanishing curve (the crease)
aD=sqrt(aD2);
//
PutPaveOnCurve(nV, aD, aNC, aMI, aMVTol);
PutPaveOnCurve(nV, aD, aNC, aMI, aMVTol, aDMVLV);
}
}//for (jVU=1; jVU=aNbVU; ++jVU) {
}
@@ -1584,6 +1641,7 @@ void BOPAlgo_PaveFiller::PutPaveOnCurve(const Standard_Integer nV,
BOPDS_Curve& aNC,
const BOPCol_MapOfInteger& aMI,
BOPCol_DataMapOfIntegerReal& aMVTol,
BOPCol_DataMapOfIntegerListOfInteger& aDMVLV,
const Standard_Integer iCheckExtend)
{
Standard_Boolean bIsVertexOnLine;
@@ -1604,23 +1662,45 @@ void BOPAlgo_PaveFiller::PutPaveOnCurve(const Standard_Integer nV,
if (bIsVertexOnLine) {
// check if aPB contains the parameter aT
Standard_Boolean bExist;
Standard_Integer nVToUpdate;
Standard_Real aPTol, aDist, aTolVNew, aTolV2, aDTol;
TopoDS_Vertex aVToUpdate;
gp_Pnt aP1, aP2;
Standard_Integer nVUsed;
Standard_Real aPTol, aDTol;
//
aTolV2 = 0.;
aDTol = 1.e-12;
//
GeomAdaptor_Curve aGAC(aIC.Curve());
aPTol = aGAC.Resolution(aTolR3D);
//
bExist = aPB->ContainsParameter(aT, aPTol, nVToUpdate);
bExist = aPB->ContainsParameter(aT, aPTol, nVUsed);
if (bExist) {
// use existing pave
aP1 = BRep_Tool::Pnt(aV);
aTolV2 = BRep_Tool::Tolerance(aV);
aVToUpdate = (*(TopoDS_Vertex *)(&myDS->Shape(nVToUpdate)));
if (!aDMVLV.IsBound(nVUsed)) {
BOPCol_ListOfInteger aList;
aList.Append(nVUsed);
aDMVLV.Bind(nVUsed, aList);
//
if (!aMVTol.IsBound(nVUsed)) {
const TopoDS_Vertex& aVUsed = (*(TopoDS_Vertex *)(&myDS->Shape(nVUsed)));
aTolV = BRep_Tool::Tolerance(aVUsed);
aMVTol.Bind(nVUsed, aTolV);
}
}
//
BOPCol_ListOfInteger& aList = aDMVLV.ChangeFind(nVUsed);
// avoid repeated elements in the list
BOPCol_ListIteratorOfListOfInteger aItLI(aList);
for (; aItLI.More(); aItLI.Next()) {
if (aItLI.Value() == nV) {
break;
}
}
if (!aItLI.More()) {
aList.Append(nV);
}
// save initial tolerance for the vertex
if (!aMVTol.IsBound(nV)) {
aTolV = BRep_Tool::Tolerance(aV);
aMVTol.Bind(nV, aTolV);
}
}
else {
// add new pave
@@ -1629,27 +1709,22 @@ void BOPAlgo_PaveFiller::PutPaveOnCurve(const Standard_Integer nV,
aPave.SetParameter(aT);
aPB->AppendExtPave(aPave);
//
aP1 = aGAC.Value(aT);
nVToUpdate = nV;
aVToUpdate = aV;
}
//
aTolV = BRep_Tool::Tolerance(aVToUpdate);
aP2 = BRep_Tool::Pnt(aVToUpdate);
aDist = aP1.Distance(aP2);
aTolVNew = aDist - aTolV2;
//
if (aTolVNew > aTolV) {
BRep_Builder aBB;
aBB.UpdateVertex(aVToUpdate, aTolVNew+aDTol);
//
if (!aMVTol.IsBound(nVToUpdate)) {
aMVTol.Bind(nVToUpdate, aTolV);
gp_Pnt aP1 = aGAC.Value(aT);
aTolV = BRep_Tool::Tolerance(aV);
gp_Pnt aP2 = BRep_Tool::Pnt(aV);
Standard_Real aDist = aP1.Distance(aP2);
if (aDist > aTolV) {
BRep_Builder().UpdateVertex(aV, aDist + aDTol);
//
if (!aMVTol.IsBound(nV)) {
aMVTol.Bind(nV, aTolV);
}
//
BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(nV);
Bnd_Box& aBoxDS=aSIDS.ChangeBox();
BRepBndLib::Add(aV, aBoxDS);
aBoxDS.SetGap(aBoxDS.GetGap() + Precision::Confusion());
}
//
BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(nVToUpdate);
Bnd_Box& aBoxDS=aSIDS.ChangeBox();
BRepBndLib::Add(aVToUpdate, aBoxDS);
}
}
}
@@ -1997,9 +2072,9 @@ Standard_Boolean BOPAlgo_PaveFiller::CheckPlanes
//purpose :
//=======================================================================
void BOPAlgo_PaveFiller::UpdatePaveBlocks
(const BOPCol_DataMapOfIntegerInteger& aDMI)
(const BOPCol_DataMapOfIntegerInteger& aDMNewSD)
{
if (aDMI.IsEmpty()) {
if (aDMNewSD.IsEmpty()) {
return;
}
//
@@ -2029,10 +2104,10 @@ void BOPAlgo_PaveFiller::UpdatePaveBlocks
aPB->Range(aT[0], aT[1]);
//
for (j = 0; j < 2; ++j) {
if (aDMI.IsBound(nV[j])) {
if (aDMNewSD.IsBound(nV[j])) {
BOPDS_Pave aPave;
//
nV[j] = aDMI.Find(nV[j]);
nV[j] = aDMNewSD.Find(nV[j]);
aPave.SetIndex(nV[j]);
aPave.SetParameter(aT[j]);
//

View File

@@ -318,48 +318,6 @@ void BOPAlgo_PaveFiller::MakePCurves()
}
}
//=======================================================================
// function: RefineFaceInfoOn
// purpose:
//=======================================================================
void BOPAlgo_PaveFiller::RefineFaceInfoOn()
{
Standard_Integer aNbPBP;
//
myErrorStatus=0;
//
BOPDS_VectorOfListOfPaveBlock& aPBP=myDS->ChangePaveBlocksPool();
aNbPBP=aPBP.Extent();
if(!aNbPBP) {
return;
}
//
Standard_Boolean bV1, bV2;
Standard_Integer i, nV1, nV2, aNbPB;
Handle(BOPDS_PaveBlock) aPB;
//
for (i=0; i<aNbPBP; ++i) {
BOPDS_ListOfPaveBlock& aLPB=aPBP(i);
//
aNbPB=aLPB.Extent();
if (aNbPB==1) {
aPB=aLPB.First();
aPB->Indices(nV1, nV2);
bV1=myDS->IsNewShape(nV1);
bV2=myDS->IsNewShape(nV2);
//
if (!(bV1 || bV2)) {
if (!myDS->IsCommonBlock(aPB)) {
// the PB seems to be untouced
aLPB.Clear();
continue;
}
}//if (!(bV1 || bV2)) {
}//if (aNbPB==1) {
}//for (i=0; i<aNbPBP; ++i) {
myDS->RefineFaceInfoOn();
}
//=======================================================================
//function : UpdateVertices
//purpose : update tolerances of vertices comparing extremities of

View File

@@ -99,6 +99,8 @@ static
//
// 2.
BOPDS_ListOfPaveBlock& aLPBD=myDS->ChangePaveBlocks(nE);
if (aLPBD.IsEmpty())
continue;
aPBD=aLPBD.First();
//
FillPaves(nV, nE, nF, aLPBOut, aPBD);
@@ -226,7 +228,7 @@ static
aPB->SetEdge(nSp);
}
else {
//aPB->SetEdge(nDE);
myDS->ChangeShapeInfo(nDE).SetReference(-1);
aLPB.Clear();
break;
}

View File

@@ -591,7 +591,11 @@ is
InitPaveBlocksForVertex(me:out;
theNV:Integer from Standard);
ReleasePaveBlocks(me:out);
---Purpose:
-- Clears information about PaveBlocks for the untouched edges.
fields
myAllocator : BaseAllocator from BOPCol is protected;
myArguments : ListOfShape from BOPCol is protected;

View File

@@ -1946,3 +1946,47 @@ void BOPDS_DS::InitPaveBlocksForVertex(const Standard_Integer theNV)
}
}
}
//=======================================================================
//function : ReleasePaveBlocks
//purpose :
//=======================================================================
void BOPDS_DS::ReleasePaveBlocks()
{
// It is necessary to remove the reference to PaveBlocks for the untouched
// edges to avoid creation of the same images for them.
// Pave blocks for this reference should be cleared.
// This will allow to differ the small edges, for which it is
// impossible to build pave block from the normal edges for which the
// pave block have been created, but stayed untouched.
// The small edge, for which no pave blocks have been created,
// should be avoided in the result, thus the reference to empty list
// of pave blocks will stay to mark the edge as Deleted.
BOPDS_VectorOfListOfPaveBlock& aPBP = ChangePaveBlocksPool();
Standard_Integer aNbPBP = aPBP.Extent();
if (!aNbPBP) {
return;
}
//
for (Standard_Integer i = 0; i < aNbPBP; ++i) {
BOPDS_ListOfPaveBlock& aLPB = aPBP(i);
if (aLPB.Extent() == 1) {
const Handle(BOPDS_PaveBlock)& aPB = aLPB.First();
if (!IsCommonBlock(aPB)) {
Standard_Integer nV1, nV2;
aPB->Indices(nV1, nV2);
if (!IsNewShape(nV1) && !IsNewShape(nV2)) {
// Both vertices are original, thus the PB is untouched.
// Remove reference for the original edge
Standard_Integer nE = aPB->OriginalEdge();
if (nE >= 0) {
ChangeShapeInfo(nE).SetReference(-1);
}
// Clear contents of the list
aLPB.Clear();
}
}
}
}
}

View File

@@ -1,6 +1,6 @@
#puts "TODO OCC12345 ALL: Faulty shapes in variables faulty_1 to faulty_"
#puts "TODO OCC12345 ALL: Error : The square of result shape is"
puts "TODO OCC12345 ALL: Error : The command is not valid"
puts "TODO OCC12345 ALL: Faulty shapes in variables faulty_1 to faulty_"
puts "TODO OCC12345 ALL: Error : The square of result shape is"
#puts "TODO OCC12345 ALL: Error : The command is not valid"
puts "TODO OCC12345 ALL: Error : Result shape is WRONG because it must contains"
puts "========================"

View File

@@ -0,0 +1,19 @@
puts "========"
puts "OCC28683"
puts "========"
puts ""
####################################################################################
## Wrong result of CUT operation
####################################################################################
restore [locate_data_file bug28683_shapes.brep] b
explode b
bcut result b_1 b_2
donly result
checkshape result
set square 1.82492
set nb_v_good 6
set nb_e_good 6
set nb_w_good 1
set nb_f_good 1