mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-10 18:51:21 +03:00
0032578: Modeling Algorithms - Splitting face by set of edges fails
Update information about ON/IN sub-shapes for all touched faces when intersection with shapes of lower types (edges and vertices) complete. Previously only the faces participating in the Face/Face intersection were updated.
This commit is contained in:
parent
3e9cb80644
commit
f72c595119
@ -471,6 +471,7 @@ void BOPAlgo_Builder::BuildSplitFaces(const Message_ProgressRange& theRange)
|
|||||||
for (j=1; j<=aNbPBIn; ++j) {
|
for (j=1; j<=aNbPBIn; ++j) {
|
||||||
const Handle(BOPDS_PaveBlock)& aPB=aMPBIn(j);
|
const Handle(BOPDS_PaveBlock)& aPB=aMPBIn(j);
|
||||||
nSp=aPB->Edge();
|
nSp=aPB->Edge();
|
||||||
|
Standard_ASSERT(nSp >= 0, "Face information is not up to date", continue);
|
||||||
aSp=(*(TopoDS_Edge*)(&myDS->Shape(nSp)));
|
aSp=(*(TopoDS_Edge*)(&myDS->Shape(nSp)));
|
||||||
//
|
//
|
||||||
aSp.Orientation(TopAbs_FORWARD);
|
aSp.Orientation(TopAbs_FORWARD);
|
||||||
|
@ -152,6 +152,7 @@ void BOPAlgo_PaveFiller::CheckSelfInterference()
|
|||||||
Standard_Integer iPB, aNbPB = aMPBF.Extent();
|
Standard_Integer iPB, aNbPB = aMPBF.Extent();
|
||||||
for (iPB = 1; iPB <= aNbPB; ++iPB) {
|
for (iPB = 1; iPB <= aNbPB; ++iPB) {
|
||||||
const Handle(BOPDS_PaveBlock)& aPB = aMPBF(iPB);
|
const Handle(BOPDS_PaveBlock)& aPB = aMPBF(iPB);
|
||||||
|
Standard_ASSERT(aPB->HasEdge(), "Face information is not up to date", continue);
|
||||||
const TopoDS_Shape& aE = myDS->Shape(aPB->Edge());
|
const TopoDS_Shape& aE = myDS->Shape(aPB->Edge());
|
||||||
// add connection
|
// add connection
|
||||||
TopTools_IndexedMapOfShape* pMSOr = aMCSI.ChangeSeek(aE);
|
TopTools_IndexedMapOfShape* pMSOr = aMCSI.ChangeSeek(aE);
|
||||||
|
@ -237,13 +237,42 @@ typedef NCollection_Vector<BOPAlgo_FaceFace> BOPAlgo_VectorOfFaceFace;
|
|||||||
//=======================================================================
|
//=======================================================================
|
||||||
void BOPAlgo_PaveFiller::PerformFF(const Message_ProgressRange& theRange)
|
void BOPAlgo_PaveFiller::PerformFF(const Message_ProgressRange& theRange)
|
||||||
{
|
{
|
||||||
|
// Update face info for all Face/Face intersection pairs
|
||||||
|
// and also for the rest of the faces with FaceInfo already initialized,
|
||||||
|
// i.e. anyhow touched faces.
|
||||||
myIterator->Initialize(TopAbs_FACE, TopAbs_FACE);
|
myIterator->Initialize(TopAbs_FACE, TopAbs_FACE);
|
||||||
Standard_Integer iSize = myIterator->ExpectedLength();
|
Standard_Integer iSize = myIterator->ExpectedLength();
|
||||||
Message_ProgressScope aPSOuter(theRange, NULL, 1);
|
|
||||||
if (!iSize) {
|
// Collect faces from intersection pairs
|
||||||
return;
|
TColStd_MapOfInteger aMIFence;
|
||||||
|
Standard_Integer nF1, nF2;
|
||||||
|
for (; myIterator->More(); myIterator->Next())
|
||||||
|
{
|
||||||
|
myIterator->Value(nF1, nF2);
|
||||||
|
aMIFence.Add (nF1);
|
||||||
|
aMIFence.Add (nF2);
|
||||||
}
|
}
|
||||||
//
|
// Collect the rest of the touched faces
|
||||||
|
for (Standard_Integer i = 0; i < myDS->NbSourceShapes(); ++i)
|
||||||
|
{
|
||||||
|
const BOPDS_ShapeInfo& aSI = myDS->ShapeInfo (i);
|
||||||
|
if (aSI.ShapeType() == TopAbs_FACE && aSI.HasReference())
|
||||||
|
{
|
||||||
|
aMIFence.Add (i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Update face info
|
||||||
|
myDS->UpdateFaceInfoOn (aMIFence);
|
||||||
|
myDS->UpdateFaceInfoIn (aMIFence);
|
||||||
|
|
||||||
|
if (!iSize)
|
||||||
|
{
|
||||||
|
// no intersection pairs found
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Message_ProgressScope aPSOuter(theRange, NULL, 1);
|
||||||
|
|
||||||
BOPDS_VectorOfInterfFF& aFFs = myDS->InterfFF();
|
BOPDS_VectorOfInterfFF& aFFs = myDS->InterfFF();
|
||||||
aFFs.SetIncrement(iSize);
|
aFFs.SetIncrement(iSize);
|
||||||
//
|
//
|
||||||
@ -255,23 +284,8 @@ void BOPAlgo_PaveFiller::PerformFF(const Message_ProgressRange& theRange)
|
|||||||
// Post-processing options
|
// Post-processing options
|
||||||
Standard_Boolean bSplitCurve = Standard_False;
|
Standard_Boolean bSplitCurve = Standard_False;
|
||||||
//
|
//
|
||||||
// Fence map to store faces with updated FaceInfo structure
|
|
||||||
TColStd_MapOfInteger aMIFence;
|
|
||||||
// Prepare the pairs of faces for intersection
|
// Prepare the pairs of faces for intersection
|
||||||
BOPAlgo_VectorOfFaceFace aVFaceFace;
|
BOPAlgo_VectorOfFaceFace aVFaceFace;
|
||||||
Standard_Integer nF1, nF2;
|
|
||||||
//
|
|
||||||
for (; myIterator->More(); myIterator->Next()) {
|
|
||||||
myIterator->Value(nF1, nF2);
|
|
||||||
|
|
||||||
aMIFence.Add (nF1);
|
|
||||||
aMIFence.Add (nF2);
|
|
||||||
}
|
|
||||||
// Update face info
|
|
||||||
myDS->UpdateFaceInfoOn (aMIFence);
|
|
||||||
myDS->UpdateFaceInfoIn (aMIFence);
|
|
||||||
|
|
||||||
// Initialize interferences
|
|
||||||
myIterator->Initialize(TopAbs_FACE, TopAbs_FACE);
|
myIterator->Initialize(TopAbs_FACE, TopAbs_FACE);
|
||||||
for (; myIterator->More(); myIterator->Next()) {
|
for (; myIterator->More(); myIterator->Next()) {
|
||||||
if (UserBreak(aPSOuter))
|
if (UserBreak(aPSOuter))
|
||||||
|
@ -634,6 +634,7 @@ void BOPAlgo_PaveFiller::MakePCurves(const Message_ProgressRange& theRange)
|
|||||||
for (j = 1; j <= aNbPBIn; ++j) {
|
for (j = 1; j <= aNbPBIn; ++j) {
|
||||||
const Handle(BOPDS_PaveBlock)& aPB = aMPBIn(j);
|
const Handle(BOPDS_PaveBlock)& aPB = aMPBIn(j);
|
||||||
nE=aPB->Edge();
|
nE=aPB->Edge();
|
||||||
|
Standard_ASSERT(nE >= 0, "Face information is not up to date", continue);
|
||||||
const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&myDS->Shape(nE)));
|
const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&myDS->Shape(nE)));
|
||||||
//
|
//
|
||||||
BOPAlgo_MPC& aMPC=aVMPC.Appended();
|
BOPAlgo_MPC& aMPC=aVMPC.Appended();
|
||||||
|
28
tests/bugs/modalg_7/bug32578
Normal file
28
tests/bugs/modalg_7/bug32578
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
puts "================================================="
|
||||||
|
puts "OCC32578: Modeling Algorithms - Splitting face by set of edges fails"
|
||||||
|
puts "================================================="
|
||||||
|
puts ""
|
||||||
|
|
||||||
|
restore [locate_data_file bug32578_face.brep] f
|
||||||
|
restore [locate_data_file bug32578_edges.brep] ce
|
||||||
|
|
||||||
|
bfuzzyvalue 0.01
|
||||||
|
|
||||||
|
bclearobjects
|
||||||
|
bcleartools
|
||||||
|
baddobjects f
|
||||||
|
eval baddtools [explode ce]
|
||||||
|
bfillds
|
||||||
|
bsplit result
|
||||||
|
|
||||||
|
checkshape result
|
||||||
|
if {![regexp "This shape seems to be OK" [bopcheck result]]} {
|
||||||
|
puts "Error: result is a self-interferring shape"
|
||||||
|
}
|
||||||
|
|
||||||
|
checknbshapes result -vertex 646 -edge 1234 -wire 589 -face 589 -t
|
||||||
|
checkprops result -s 351.033
|
||||||
|
|
||||||
|
checkview -display result -2d -path ${imagedir}/${test_image}.png
|
||||||
|
|
||||||
|
boptions -default
|
Loading…
x
Reference in New Issue
Block a user