mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-04 13:13:25 +03:00
0029711: General Fuse operation produces invalid result
The following improvements have been introduced in Boolean Operations algorithm s: 1. UBTree is replaced with EBTree in Boolean operations to be able to add/remove elements into the tree of bounding boxes. 2. Repeated (nested) intersection of sub-shapes is performed with argument vertices whose tolerances increased during the operation. 3. The algorithms of Edge/Edge and Edge/Face intersection have been improved for the cases when the intersection point is located close to the edge boundaries . 4. New procedure has been implemented to ensure forced creation of Edge/Face common blocks in cases when the edge is really close to the face. 5. Post-processing of Face/Face intersection results has been improved. 6. Extension of the planar faces for Plane/Plane intersection is avoided. 7. Builder Face now better classifies potentially internal edges relatively to new faces with filtering by bounding boxes. Side effect changes: 1. IntTools_ShrunkRange now keeps the length of the valid range of the edge. 2. The method BOPDS_DS::UpdateEdgeTolerance() has been removed as unused (replaced by the BOPAlgo_PaveFiller::UpdateEdgeTolerance()). Test case for the issue 0029900. Test case for the issue 0029711. Adjustments of the existing test cases. Avoid using uninitialized variables.
This commit is contained in:
@@ -92,5 +92,8 @@ Error: The Feature Removal algorithm has failed
|
||||
.BOPAlgo_AlertSolidBuilderUnusedFaces
|
||||
Warning: Some of the faces passed to the Solid Builder algorithm have not been classified and not used for solids creation
|
||||
|
||||
.BOPAlgo_AlertFaceBuilderUnusedEdges
|
||||
Warning: Some of the edges passed to the Face Builder algorithm have not been classified and not used for faces creation
|
||||
|
||||
.BOPAlgo_AlertUnableToOrientTheShape
|
||||
Warning: Unable to orient the shape correctly
|
||||
|
@@ -104,6 +104,10 @@ DEFINE_SIMPLE_ALERT(BOPAlgo_AlertRemoveFeaturesFailed)
|
||||
//! and not used for solids creation
|
||||
DEFINE_ALERT_WITH_SHAPE(BOPAlgo_AlertSolidBuilderUnusedFaces)
|
||||
|
||||
//! Some of the edges passed to the Face Builder algorithm have not been classified
|
||||
//! and not used for faces creation
|
||||
DEFINE_ALERT_WITH_SHAPE(BOPAlgo_AlertFaceBuilderUnusedEdges)
|
||||
|
||||
//! Unable to orient the shape correctly
|
||||
DEFINE_ALERT_WITH_SHAPE(BOPAlgo_AlertUnableToOrientTheShape)
|
||||
|
||||
|
@@ -95,5 +95,8 @@ static const char BOPAlgo_BOPAlgo_msg[] =
|
||||
".BOPAlgo_AlertSolidBuilderUnusedFaces\n"
|
||||
"Warning: Some of the faces passed to the Solid Builder algorithm have not been classified and not used for solids creation\n"
|
||||
"\n"
|
||||
".BOPAlgo_AlertFaceBuilderUnusedEdges\n"
|
||||
"Warning: Some of the edges passed to the Face Builder algorithm have not been classified and not used for faces creation\n"
|
||||
"\n"
|
||||
".BOPAlgo_AlertUnableToOrientTheShape\n"
|
||||
"Warning: Unable to orient the shape correctly\n";
|
||||
|
@@ -39,7 +39,7 @@
|
||||
#include <IntTools_FClass2d.hxx>
|
||||
#include <NCollection_DataMap.hxx>
|
||||
#include <NCollection_UBTreeFiller.hxx>
|
||||
#include <TColStd_MapIntegerHasher.hxx>
|
||||
#include <TColStd_MapOfInteger.hxx>
|
||||
#include <TopAbs.hxx>
|
||||
#include <TopExp.hxx>
|
||||
#include <TopExp_Explorer.hxx>
|
||||
@@ -443,6 +443,7 @@ void BOPAlgo_BuilderFace::PerformAreas()
|
||||
{
|
||||
// No holes, stop the analysis
|
||||
myAreas.Append(aNewFaces);
|
||||
return;
|
||||
}
|
||||
|
||||
// Classify holes relatively faces
|
||||
@@ -580,76 +581,132 @@ void BOPAlgo_BuilderFace::PerformAreas()
|
||||
//=======================================================================
|
||||
void BOPAlgo_BuilderFace::PerformInternalShapes()
|
||||
{
|
||||
if (myAvoidInternalShapes) {
|
||||
if (myAvoidInternalShapes)
|
||||
// User-defined option to avoid internal edges
|
||||
// in the result is in force.
|
||||
return;
|
||||
}
|
||||
//
|
||||
Standard_Integer aNbWI=myLoopsInternal.Extent();
|
||||
if (!aNbWI) {// nothing to do
|
||||
|
||||
if (myLoopsInternal.IsEmpty())
|
||||
// No edges left for classification
|
||||
return;
|
||||
|
||||
// Prepare tree filler with the boxes of the edges to classify
|
||||
NCollection_UBTree<Standard_Integer, Bnd_Box2d> aBBTree;
|
||||
NCollection_UBTreeFiller <Standard_Integer, Bnd_Box2d> aTreeFiller(aBBTree);
|
||||
|
||||
// Map of edges to classify
|
||||
TopTools_IndexedMapOfShape anEdgesMap;
|
||||
|
||||
// Fill the tree and the map
|
||||
TopTools_ListIteratorOfListOfShape itLE(myLoopsInternal);
|
||||
for (; itLE.More(); itLE.Next())
|
||||
{
|
||||
TopoDS_Iterator itE(itLE.Value());
|
||||
for (; itE.More(); itE.Next())
|
||||
{
|
||||
const TopoDS_Edge& aE = TopoDS::Edge(itE.Value());
|
||||
if (!anEdgesMap.Contains(aE))
|
||||
{
|
||||
Bnd_Box2d aBoxE;
|
||||
BRepTools::AddUVBounds(myFace, aE, aBoxE);
|
||||
// Make sure the index of edge in the map and
|
||||
// of the box in the tree is the same
|
||||
aTreeFiller.Add(anEdgesMap.Add(aE), aBoxE);
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
//Standard_Real aTol;
|
||||
Standard_Integer i;
|
||||
BRep_Builder aBB;
|
||||
TopTools_ListIteratorOfListOfShape aIt1, aIt2;
|
||||
TopoDS_Iterator aIt;
|
||||
TopTools_IndexedMapOfShape aME1, aME2, aMEP;
|
||||
TopTools_IndexedDataMapOfShapeListOfShape aMVE;
|
||||
|
||||
// Shake the tree
|
||||
aTreeFiller.Fill();
|
||||
|
||||
// Fence map
|
||||
TColStd_MapOfInteger aMEDone;
|
||||
|
||||
// Classify edges relatively faces
|
||||
TopTools_ListIteratorOfListOfShape itLF(myAreas);
|
||||
for (; itLF.More(); itLF.Next())
|
||||
{
|
||||
TopoDS_Face& aF = *(TopoDS_Face*)&itLF.Value();
|
||||
|
||||
// Build box
|
||||
Bnd_Box2d aBoxF;
|
||||
BRepTools::AddUVBounds(aF, aBoxF);
|
||||
|
||||
// Select edges for the classification
|
||||
BOPTools_BoxSelector<Bnd_Box2d> aSelector;
|
||||
aSelector.SetBox(aBoxF);
|
||||
if (!aBBTree.Select(aSelector))
|
||||
continue;
|
||||
|
||||
// Collect edges inside the face
|
||||
TopTools_IndexedMapOfShape anEdgesInside;
|
||||
|
||||
const TColStd_ListOfInteger& aLI = aSelector.Indices();
|
||||
TColStd_ListIteratorOfListOfInteger itLI(aLI);
|
||||
for (; itLI.More(); itLI.Next())
|
||||
{
|
||||
const Standard_Integer nE = itLI.Value();
|
||||
if (aMEDone.Contains(nE))
|
||||
continue;
|
||||
|
||||
const TopoDS_Edge& aE = TopoDS::Edge(anEdgesMap(nE));
|
||||
if (IsInside(aE, aF, myContext))
|
||||
{
|
||||
anEdgesInside.Add(aE);
|
||||
aMEDone.Add(nE);
|
||||
}
|
||||
}
|
||||
|
||||
if (anEdgesInside.IsEmpty())
|
||||
continue;
|
||||
|
||||
// Make internal wires
|
||||
TopTools_ListOfShape aLSI;
|
||||
MakeInternalWires(anEdgesInside, aLSI);
|
||||
|
||||
// Add wires to a face
|
||||
TopTools_ListIteratorOfListOfShape itLSI(aLSI);
|
||||
for (; itLSI.More(); itLSI.Next())
|
||||
{
|
||||
const TopoDS_Shape& aWI = itLSI.Value();
|
||||
BRep_Builder().Add(aF, aWI);
|
||||
}
|
||||
|
||||
// Condition of early exit
|
||||
if (aMEDone.Extent() == anEdgesMap.Extent())
|
||||
// All edges are classified and added into the faces
|
||||
return;
|
||||
}
|
||||
|
||||
// Some edges are left unclassified - warn user about them
|
||||
TopTools_IndexedMapOfShape anEdgesUnUsed;
|
||||
for (Standard_Integer i = 1; i <= anEdgesMap.Extent(); ++i)
|
||||
{
|
||||
if (!aMEDone.Contains(i))
|
||||
anEdgesUnUsed.Add(anEdgesMap(i));
|
||||
}
|
||||
|
||||
// Make internal wires
|
||||
TopTools_ListOfShape aLSI;
|
||||
//
|
||||
// 1. All internal edges
|
||||
aIt1.Initialize(myLoopsInternal);
|
||||
for (; aIt1.More(); aIt1.Next()) {
|
||||
const TopoDS_Shape& aWire=aIt1.Value();
|
||||
aIt.Initialize(aWire);
|
||||
for (; aIt.More(); aIt.Next()) {
|
||||
const TopoDS_Shape& aE=aIt.Value();
|
||||
aME1.Add(aE);
|
||||
}
|
||||
MakeInternalWires(anEdgesUnUsed, aLSI);
|
||||
|
||||
// Make compound
|
||||
TopoDS_Compound aWShape;
|
||||
BRep_Builder().MakeCompound(aWShape);
|
||||
BRep_Builder().Add(aWShape, myFace);
|
||||
if (aLSI.Extent() == 1)
|
||||
BRep_Builder().Add(aWShape, aLSI.First());
|
||||
else
|
||||
{
|
||||
TopoDS_Compound aCE;
|
||||
BRep_Builder().MakeCompound(aCE);
|
||||
for (TopTools_ListIteratorOfListOfShape it(aLSI); it.More(); it.Next())
|
||||
BRep_Builder().Add(aCE, it.Value());
|
||||
BRep_Builder().Add(aWShape, aCE);
|
||||
}
|
||||
//
|
||||
// 2 Process faces
|
||||
aIt2.Initialize(myAreas);
|
||||
for ( ; aIt2.More(); aIt2.Next()) {
|
||||
TopoDS_Face& aF=(*(TopoDS_Face *)(&aIt2.Value()));
|
||||
//
|
||||
aMVE.Clear();
|
||||
TopExp::MapShapesAndAncestors(aF, TopAbs_VERTEX, TopAbs_EDGE, aMVE);
|
||||
//
|
||||
// 2.1 Separate faces to process aMEP
|
||||
aME2.Clear();
|
||||
aMEP.Clear();
|
||||
aNbWI = aME1.Extent();
|
||||
for (i = 1; i <= aNbWI; ++i) {
|
||||
const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&aME1(i)));
|
||||
if (IsInside(aE, aF, myContext)) {
|
||||
aMEP.Add(aE);
|
||||
}
|
||||
else {
|
||||
aME2.Add(aE);
|
||||
}
|
||||
}
|
||||
//
|
||||
// 2.2 Make Internal Wires
|
||||
aLSI.Clear();
|
||||
MakeInternalWires(aMEP, aLSI);
|
||||
//
|
||||
// 2.3 Add them to aF
|
||||
aIt1.Initialize(aLSI);
|
||||
for (; aIt1.More(); aIt1.Next()) {
|
||||
const TopoDS_Shape& aSI=aIt1.Value();
|
||||
aBB.Add (aF, aSI);
|
||||
}
|
||||
//
|
||||
// 2.4 Remove faces aMFP from aMF
|
||||
aME1 = aME2;
|
||||
//
|
||||
aNbWI = aME1.Extent();
|
||||
if (!aNbWI) {
|
||||
break;
|
||||
}
|
||||
} //for ( ; aIt2.More(); aIt2.Next()) {
|
||||
|
||||
// Add warning
|
||||
AddWarning(new BOPAlgo_AlertFaceBuilderUnusedEdges(aWShape));
|
||||
}
|
||||
//=======================================================================
|
||||
//function : MakeInternalWires
|
||||
|
@@ -685,7 +685,8 @@ void BOPAlgo_BuilderSolid::PerformInternalShapes()
|
||||
aBB.Add(aWShape, aItLS.Value());
|
||||
}
|
||||
|
||||
AddWarning(new BOPAlgo_AlertSolidBuilderUnusedFaces(aWShape)); }
|
||||
AddWarning(new BOPAlgo_AlertSolidBuilderUnusedFaces(aWShape));
|
||||
}
|
||||
}
|
||||
//=======================================================================
|
||||
//function : MakeInternalShells
|
||||
|
@@ -461,6 +461,7 @@ void BOPAlgo_Builder::BuildSplitFaces()
|
||||
{
|
||||
BOPAlgo_BuilderFace& aBF = aVBF(k);
|
||||
aFacesIm.Add(myDS->Index(aBF.Face()), aBF.Areas());
|
||||
myReport->Merge(aBF.GetReport());
|
||||
}
|
||||
|
||||
aNbBF = aFacesIm.Extent();
|
||||
|
@@ -54,7 +54,10 @@ BOPAlgo_PaveFiller::BOPAlgo_PaveFiller()
|
||||
BOPAlgo_PaveFiller::BOPAlgo_PaveFiller
|
||||
(const Handle(NCollection_BaseAllocator)& theAllocator)
|
||||
:
|
||||
BOPAlgo_Algo(theAllocator)
|
||||
BOPAlgo_Algo(theAllocator),
|
||||
myFPBDone(1, theAllocator),
|
||||
myIncreasedSS(1, theAllocator),
|
||||
myVertsToAvoidExtension(1, theAllocator)
|
||||
{
|
||||
myDS = NULL;
|
||||
myIterator = NULL;
|
||||
@@ -134,6 +137,7 @@ void BOPAlgo_PaveFiller::Clear()
|
||||
delete myDS;
|
||||
myDS=NULL;
|
||||
}
|
||||
myIncreasedSS.Clear();
|
||||
}
|
||||
//=======================================================================
|
||||
//function : DS
|
||||
@@ -286,9 +290,17 @@ void BOPAlgo_PaveFiller::PerformInternal()
|
||||
UpdatePaveBlocksWithSDVertices();
|
||||
UpdateInterfsWithSDVertices();
|
||||
|
||||
// Repeat Intersection with increased vertices
|
||||
RepeatIntersection();
|
||||
if (HasErrors())
|
||||
return;
|
||||
|
||||
// Force intersection of edges after increase
|
||||
// of the tolerance values of their vertices
|
||||
ForceInterfEE();
|
||||
// Force Edge/Face intersection after increase
|
||||
// of the tolerance values of their vertices
|
||||
ForceInterfEF();
|
||||
//
|
||||
// 22
|
||||
PerformFF();
|
||||
@@ -326,3 +338,58 @@ void BOPAlgo_PaveFiller::PerformInternal()
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: RepeatIntersection
|
||||
// purpose:
|
||||
//=======================================================================
|
||||
void BOPAlgo_PaveFiller::RepeatIntersection()
|
||||
{
|
||||
// Find all vertices with increased tolerance
|
||||
TColStd_MapOfInteger anExtraInterfMap;
|
||||
const Standard_Integer aNbS = myDS->NbSourceShapes();
|
||||
for (Standard_Integer i = 0; i < aNbS; ++i)
|
||||
{
|
||||
const BOPDS_ShapeInfo& aSI = myDS->ShapeInfo(i);
|
||||
if (aSI.ShapeType() != TopAbs_VERTEX)
|
||||
continue;
|
||||
// Check if the tolerance of the original vertex has been increased
|
||||
if (myIncreasedSS.Contains(i))
|
||||
{
|
||||
anExtraInterfMap.Add(i);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check if the vertex created a new vertex with greater tolerance
|
||||
Standard_Integer nVSD;
|
||||
if (!myDS->HasShapeSD(i, nVSD))
|
||||
continue;
|
||||
|
||||
if (myIncreasedSS.Contains(nVSD))
|
||||
anExtraInterfMap.Add(i);
|
||||
}
|
||||
|
||||
if (anExtraInterfMap.IsEmpty())
|
||||
return;
|
||||
|
||||
// Update iterator of pairs of shapes with interfering boxes
|
||||
myIterator->PrepareExt(anExtraInterfMap);
|
||||
|
||||
// Perform intersections with vertices
|
||||
PerformVV();
|
||||
if (HasErrors())
|
||||
return;
|
||||
UpdatePaveBlocksWithSDVertices();
|
||||
|
||||
PerformVE();
|
||||
if (HasErrors())
|
||||
return;
|
||||
UpdatePaveBlocksWithSDVertices();
|
||||
|
||||
PerformVF();
|
||||
if (HasErrors())
|
||||
return;
|
||||
|
||||
UpdatePaveBlocksWithSDVertices();
|
||||
UpdateInterfsWithSDVertices();
|
||||
}
|
||||
|
@@ -172,6 +172,14 @@ protected:
|
||||
Bnd_Box,
|
||||
TColStd_MapTransientHasher> BOPAlgo_DataMapOfPaveBlockBndBox;
|
||||
|
||||
typedef NCollection_DataMap
|
||||
<Handle(BOPDS_PaveBlock),
|
||||
TColStd_ListOfInteger,
|
||||
TColStd_MapTransientHasher> BOPAlgo_DataMapOfPaveBlockListOfInteger;
|
||||
|
||||
typedef NCollection_DataMap
|
||||
<Standard_Integer,
|
||||
BOPDS_MapOfPaveBlock> BOPAlgo_DataMapOfIntegerMapOfPaveBlock;
|
||||
|
||||
//! Sets non-destructive mode automatically if an argument
|
||||
//! contains a locked sub-shape (see TopoDS_Shape::Locked()).
|
||||
@@ -265,7 +273,8 @@ protected:
|
||||
TColStd_DataMapOfIntegerReal& theMVTol,
|
||||
TColStd_DataMapOfIntegerListOfInteger& theDMVLV);
|
||||
|
||||
Standard_EXPORT void FilterPavesOnCurves(const BOPDS_VectorOfCurve& theVNC);
|
||||
Standard_EXPORT void FilterPavesOnCurves(const BOPDS_VectorOfCurve& theVNC,
|
||||
TColStd_DataMapOfIntegerReal& theMVTol);
|
||||
|
||||
//! Depending on the parameter aType it checks whether
|
||||
//! the vertex nV was created in EE or EF intersections.
|
||||
@@ -281,21 +290,30 @@ protected:
|
||||
const TopoDS_Face& theF2,
|
||||
BOPDS_Curve& theNC,
|
||||
TColStd_ListOfInteger& theLBV);
|
||||
|
||||
|
||||
//! Checks if the given pave block (created on section curve)
|
||||
//! coincides with any of the pave blocks of the faces
|
||||
//! created the section curve.
|
||||
Standard_EXPORT Standard_Boolean IsExistingPaveBlock
|
||||
(const Handle(BOPDS_PaveBlock)& thePB, const BOPDS_Curve& theNC,
|
||||
const Standard_Real theTolR3D, const BOPDS_IndexedMapOfPaveBlock& theMPB,
|
||||
const BOPDS_MapOfPaveBlock& theMPBCommon,
|
||||
Handle(BOPDS_PaveBlock)& thePBOut, Standard_Real& theTolNew);
|
||||
|
||||
Standard_EXPORT Standard_Boolean IsExistingPaveBlock (const Handle(BOPDS_PaveBlock)& thePB, const BOPDS_Curve& theNC, const TColStd_ListOfInteger& theLSE);
|
||||
|
||||
|
||||
//! Checks if the given pave block (created on section curve)
|
||||
//! coincides with any of the edges shared between the faces
|
||||
//! created the section curve.
|
||||
Standard_EXPORT Standard_Boolean IsExistingPaveBlock(const Handle(BOPDS_PaveBlock)& thePB,
|
||||
const BOPDS_Curve& theNC,
|
||||
const TColStd_ListOfInteger& theLSE,
|
||||
Standard_Integer& theNEOut,
|
||||
Standard_Real& theTolNew);
|
||||
|
||||
//! Treatment of section edges.
|
||||
Standard_EXPORT void PostTreatFF (BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMSCPB,
|
||||
BOPDS_DataMapOfPaveBlockListOfPaveBlock& theDMExEdges,
|
||||
TColStd_DataMapOfIntegerInteger& theDMNewSD,
|
||||
const TopTools_IndexedMapOfShape& theMicroEdges,
|
||||
const BOPDS_IndexedMapOfPaveBlock& theMicroPB,
|
||||
const TopTools_IndexedMapOfShape& theVertsOnRejectedPB,
|
||||
const Handle(NCollection_BaseAllocator)& theAllocator);
|
||||
|
||||
@@ -360,14 +378,24 @@ protected:
|
||||
|
||||
//! Adds the existing edges from the map <theMPBOnIn> which interfere
|
||||
//! with the vertices from <theMVB> map to the post treatment of section edges.
|
||||
Standard_EXPORT void ProcessExistingPaveBlocks (const Standard_Integer theInt, const BOPDS_IndexedMapOfPaveBlock& theMPBOnIn, const TColStd_DataMapOfIntegerListOfInteger& theDMBV, BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMSCPB, TopTools_DataMapOfShapeInteger& theMVI, BOPDS_MapOfPaveBlock& theMPB);
|
||||
Standard_EXPORT void ProcessExistingPaveBlocks (const Standard_Integer theInt,
|
||||
const Standard_Integer nF1,
|
||||
const Standard_Integer nF2,
|
||||
const BOPDS_IndexedMapOfPaveBlock& theMPBOnIn,
|
||||
const TColStd_DataMapOfIntegerListOfInteger& theDMBV,
|
||||
BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMSCPB,
|
||||
TopTools_DataMapOfShapeInteger& theMVI,
|
||||
BOPAlgo_DataMapOfPaveBlockListOfInteger& thePBFacesMap,
|
||||
BOPDS_MapOfPaveBlock& theMPB);
|
||||
|
||||
|
||||
//! Replaces existing pave block <thePB> with new pave blocks <theLPB>.
|
||||
//! The list <theLPB> contains images of <thePB> which were created in
|
||||
//! the post treatment of section edges.
|
||||
Standard_EXPORT void UpdateExistingPaveBlocks (const Handle(BOPDS_PaveBlock)& thePB, BOPDS_ListOfPaveBlock& theLPB, const Standard_Integer nF1, const Standard_Integer nF2);
|
||||
|
||||
//! Tries to project the new edges on the faces contained in the <thePBFacesMap>.
|
||||
Standard_EXPORT void UpdateExistingPaveBlocks(const Handle(BOPDS_PaveBlock)& thePB,
|
||||
BOPDS_ListOfPaveBlock& theLPB,
|
||||
const BOPAlgo_DataMapOfPaveBlockListOfInteger& thePBFacesMap);
|
||||
|
||||
//! Treatment of vertices that were created in EE intersections.
|
||||
Standard_EXPORT void TreatNewVertices(const BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMVCPB, TopTools_IndexedDataMapOfShapeListOfShape& theImages);
|
||||
@@ -382,8 +410,9 @@ protected:
|
||||
Standard_EXPORT void PreparePostTreatFF (const Standard_Integer aInt, const Standard_Integer aCur, const Handle(BOPDS_PaveBlock)& aPB, BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& aMSCPB, TopTools_DataMapOfShapeInteger& aMVI, BOPDS_ListOfPaveBlock& aLPB);
|
||||
|
||||
//! Updates the information about faces
|
||||
Standard_EXPORT void UpdateFaceInfo (BOPDS_DataMapOfPaveBlockListOfPaveBlock& theDME, const TColStd_DataMapOfIntegerInteger& theDMV);
|
||||
|
||||
Standard_EXPORT void UpdateFaceInfo(BOPDS_DataMapOfPaveBlockListOfPaveBlock& theDME,
|
||||
const TColStd_DataMapOfIntegerInteger& theDMV,
|
||||
const BOPAlgo_DataMapOfPaveBlockListOfInteger& thePBFacesMap);
|
||||
|
||||
//! Updates tolerance of vertex with index <nV>
|
||||
//! to make it interfere with edge.
|
||||
@@ -485,17 +514,31 @@ protected:
|
||||
//! Adds the warning about failed intersection of pair of sub-shapes
|
||||
Standard_EXPORT void AddIntersectionFailedWarning(const TopoDS_Shape& theS1, const TopoDS_Shape& theS2);
|
||||
|
||||
//! Repeat intersection of sub-shapes with increased vertices.
|
||||
Standard_EXPORT void RepeatIntersection();
|
||||
|
||||
//! Updates vertices of CommonBlocks with real tolerance of CB.
|
||||
Standard_EXPORT void UpdateVerticesOfCB();
|
||||
|
||||
//! The method looks for the additional common blocks among pairs of edges
|
||||
//! which did not participate in edges intersection (PerformEE() method)
|
||||
//! due to being rejected by bounding boxes intersection.
|
||||
//! with the same bounding vertices.
|
||||
Standard_EXPORT void ForceInterfEE();
|
||||
|
||||
//! The method looks for the additional edge/face common blocks
|
||||
//! among pairs of edge/face having the same vertices.
|
||||
Standard_EXPORT void ForceInterfEF();
|
||||
|
||||
//! Performs intersection of given pave blocks
|
||||
//! with all faces from arguments.
|
||||
Standard_EXPORT void ForceInterfEF(const BOPDS_IndexedMapOfPaveBlock& theMPB,
|
||||
const Standard_Boolean theAddInterf);
|
||||
|
||||
//! When all section edges are created and no increase of the tolerance
|
||||
//! of vertices put on the section edges is expected, make sure that
|
||||
//! the created sections have valid range.
|
||||
//! If any of the section edges do not have valid range, remove them
|
||||
//! from Face/Face intersection info and from the input <theMSCPB> map.
|
||||
//! Put such edges into <aMicroEdges> map for further unification of their
|
||||
//! Put such edges into <MicroPB> map for further unification of their
|
||||
//! vertices in the PostTreatFF method.
|
||||
//!
|
||||
//! All these section edges have already been checked to have valid range.
|
||||
@@ -503,7 +546,7 @@ protected:
|
||||
//! been put on other section edges with greater tolerance, which has caused
|
||||
//! increase of the tolerance value of the vertices.
|
||||
Standard_EXPORT void RemoveMicroSectionEdges(BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMSCPB,
|
||||
TopTools_IndexedMapOfShape& theMicroEdges);
|
||||
BOPDS_IndexedMapOfPaveBlock& theMicroPB);
|
||||
|
||||
|
||||
TopTools_ListOfShape myArguments;
|
||||
@@ -516,8 +559,12 @@ protected:
|
||||
Standard_Boolean myAvoidBuildPCurve;
|
||||
BOPAlgo_GlueEnum myGlue;
|
||||
|
||||
|
||||
private:
|
||||
BOPAlgo_DataMapOfIntegerMapOfPaveBlock myFPBDone; //!< Fence map of intersected faces and pave blocks
|
||||
TColStd_MapOfInteger myIncreasedSS; //!< Sub-shapes with increased tolerance during the operation
|
||||
TColStd_MapOfInteger myVertsToAvoidExtension; //!< Vertices located close to E/E or E/F intersection points
|
||||
//! which has already been extended to cover the real intersection
|
||||
//! points, and should not be extended any longer to be put
|
||||
//! on a section curve.
|
||||
|
||||
};
|
||||
|
||||
|
@@ -68,14 +68,27 @@ void BOPAlgo_PaveFiller::PerformVV()
|
||||
for (; myIterator->More(); myIterator->Next()) {
|
||||
myIterator->Value(n1, n2);
|
||||
//
|
||||
const TopoDS_Vertex& aV1=(*(TopoDS_Vertex *)(&myDS->Shape(n1)));
|
||||
const TopoDS_Vertex& aV2=(*(TopoDS_Vertex *)(&myDS->Shape(n2)));
|
||||
//
|
||||
iFlag=BOPTools_AlgoTools::ComputeVV(aV1, aV2, myFuzzyValue);
|
||||
if (myDS->HasInterf(n1, n2))
|
||||
{
|
||||
BOPAlgo_Tools::FillMap<Standard_Integer, TColStd_MapIntegerHasher>(n1, n2, aMILI, aAllocator);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check for SD vertices
|
||||
Standard_Integer n1SD = n1;
|
||||
myDS->HasShapeSD(n1, n1SD);
|
||||
|
||||
Standard_Integer n2SD = n2;
|
||||
myDS->HasShapeSD(n2, n2SD);
|
||||
|
||||
const TopoDS_Vertex& aV1=(*(TopoDS_Vertex *)(&myDS->Shape(n1SD)));
|
||||
const TopoDS_Vertex& aV2=(*(TopoDS_Vertex *)(&myDS->Shape(n2SD)));
|
||||
|
||||
iFlag = BOPTools_AlgoTools::ComputeVV(aV1, aV2, myFuzzyValue);
|
||||
if (!iFlag) {
|
||||
BOPAlgo_Tools::FillMap<Standard_Integer, TColStd_MapIntegerHasher>(n1, n2, aMILI, aAllocator);
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// 2. Make blocks
|
||||
BOPAlgo_Tools::MakeBlocks<Standard_Integer, TColStd_MapIntegerHasher>(aMILI, aMBlocks, aAllocator);
|
||||
@@ -182,11 +195,12 @@ Standard_Integer BOPAlgo_PaveFiller::MakeSDVertices
|
||||
}
|
||||
//
|
||||
if (theAddInterfs) {
|
||||
myDS->AddInterf(n1, n2);
|
||||
BOPDS_InterfVV& aVV = aVVs.Appended();
|
||||
//
|
||||
aVV.SetIndices(n1, n2);
|
||||
aVV.SetIndexNew(nV);
|
||||
if (myDS->AddInterf(n1, n2))
|
||||
{
|
||||
BOPDS_InterfVV& aVV = aVVs.Appended();
|
||||
aVV.SetIndices(n1, n2);
|
||||
aVV.SetIndexNew(nV);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -63,59 +63,40 @@ void BOPAlgo_PaveFiller::SetNonDestructive()
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void BOPAlgo_PaveFiller::UpdateEdgeTolerance (const Standard_Integer nE,
|
||||
const Standard_Real aTol)
|
||||
const Standard_Real theTol)
|
||||
{
|
||||
Standard_Boolean bIsNewShape, bHasShapeSD;
|
||||
Standard_Integer nV, nVx;
|
||||
Standard_Real aTolV;
|
||||
BRep_Builder aBB;
|
||||
TColStd_ListIteratorOfListOfInteger aIt;
|
||||
//
|
||||
BOPDS_ShapeInfo& aSIE=myDS->ChangeShapeInfo(nE);
|
||||
const TColStd_ListOfInteger& aLI=aSIE.SubShapes();
|
||||
//
|
||||
if (myNonDestructive) {
|
||||
bIsNewShape=myDS->IsNewShape(nE);
|
||||
if (!bIsNewShape) {
|
||||
BOPDS_ShapeInfo& aSIE = myDS->ChangeShapeInfo(nE);
|
||||
const TColStd_ListOfInteger& aLI = aSIE.SubShapes();
|
||||
|
||||
// For the safe input mode avoid modifying the input shapes
|
||||
if (myNonDestructive)
|
||||
{
|
||||
if (!myDS->IsNewShape(nE))
|
||||
return;
|
||||
}
|
||||
//
|
||||
aIt.Initialize(aLI);
|
||||
for (; aIt.More(); aIt.Next()) {
|
||||
nV = aIt.Value();
|
||||
bHasShapeSD=myDS->HasShapeSD(nV, nVx);
|
||||
if (bHasShapeSD) {
|
||||
continue;
|
||||
}
|
||||
bIsNewShape=myDS->IsNewShape(nV);
|
||||
if (!bIsNewShape) {
|
||||
|
||||
TColStd_ListIteratorOfListOfInteger itLI(aLI);
|
||||
for (; itLI.More(); itLI.Next())
|
||||
{
|
||||
Standard_Integer nV = itLI.Value(), nVSD;
|
||||
if (!myDS->IsNewShape(nV) &&
|
||||
!myDS->HasShapeSD(nV, nVSD))
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
|
||||
// Update edge
|
||||
const TopoDS_Edge& aE = *(TopoDS_Edge*)&myDS->Shape(nE);
|
||||
aBB.UpdateEdge(aE, aTol);
|
||||
Bnd_Box& aBoxE=aSIE.ChangeBox();
|
||||
BRep_Builder().UpdateEdge(aE, theTol);
|
||||
Bnd_Box& aBoxE = aSIE.ChangeBox();
|
||||
BRepBndLib::Add(aE, aBoxE);
|
||||
aBoxE.SetGap(aBoxE.GetGap() + Precision::Confusion());
|
||||
//
|
||||
aIt.Initialize(aLI);
|
||||
for (; aIt.More(); aIt.Next()) {
|
||||
nV = aIt.Value();
|
||||
bHasShapeSD=myDS->HasShapeSD(nV, nVx);
|
||||
if (bHasShapeSD) {
|
||||
nV=nVx;
|
||||
}
|
||||
const TopoDS_Vertex& aV = *(TopoDS_Vertex*)&myDS->Shape(nV);
|
||||
aTolV = BRep_Tool::Tolerance(aV);
|
||||
if (aTolV < aTol) {
|
||||
aBB.UpdateVertex(aV, aTol);
|
||||
BOPDS_ShapeInfo& aSIV = myDS->ChangeShapeInfo(nV);
|
||||
Bnd_Box& aBoxV = aSIV.ChangeBox();
|
||||
BRepBndLib::Add(aV, aBoxV);
|
||||
aBoxV.SetGap(aBoxV.GetGap() + Precision::Confusion());
|
||||
}
|
||||
|
||||
// Update vertices
|
||||
TColStd_ListIteratorOfListOfInteger itLI(aLI);
|
||||
for (; itLI.More(); itLI.Next())
|
||||
{
|
||||
Standard_Integer nV = itLI.Value();
|
||||
UpdateVertex(nV, theTol);
|
||||
}
|
||||
}
|
||||
//=======================================================================
|
||||
@@ -143,6 +124,7 @@ Standard_Integer BOPAlgo_PaveFiller::UpdateVertex
|
||||
Bnd_Box& aBoxV = aSIV.ChangeBox();
|
||||
BRepBndLib::Add(aVSD, aBoxV);
|
||||
aBoxV.SetGap(aBoxV.GetGap() + Precision::Confusion());
|
||||
myIncreasedSS.Add(nV);
|
||||
}
|
||||
return nVNew;
|
||||
}
|
||||
@@ -172,7 +154,13 @@ Standard_Integer BOPAlgo_PaveFiller::UpdateVertex
|
||||
myDS->AddShapeSD(nV, nVNew);
|
||||
//
|
||||
myDS->InitPaveBlocksForVertex(nV);
|
||||
//
|
||||
|
||||
// Add new vertex to map of vertices to avoid further extension
|
||||
myVertsToAvoidExtension.Add(nVNew);
|
||||
|
||||
if (aTolV < aTolNew)
|
||||
myIncreasedSS.Add(nV);
|
||||
|
||||
return nVNew;
|
||||
}
|
||||
//=======================================================================
|
||||
|
@@ -179,6 +179,10 @@ void BOPAlgo_PaveFiller::PerformVE()
|
||||
continue;
|
||||
}
|
||||
//
|
||||
if (myDS->HasInterf(nV, nE)) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
if (myDS->HasInterfShapeSubShapes(nV, nE)) {
|
||||
continue;
|
||||
}
|
||||
|
@@ -30,11 +30,13 @@
|
||||
#include <BOPDS_PaveBlock.hxx>
|
||||
#include <BOPDS_VectorOfInterfEE.hxx>
|
||||
#include <BOPTools_AlgoTools.hxx>
|
||||
#include <BOPTools_AlgoTools2D.hxx>
|
||||
#include <BOPTools_Parallel.hxx>
|
||||
#include <BndLib_Add3dCurve.hxx>
|
||||
#include <BRep_Tool.hxx>
|
||||
#include <BRep_Builder.hxx>
|
||||
#include <BRepAdaptor_Curve.hxx>
|
||||
#include <GeomAPI_ProjectPointOnCurve.hxx>
|
||||
#include <gp_Pnt.hxx>
|
||||
#include <IntTools_CommonPrt.hxx>
|
||||
#include <IntTools_Context.hxx>
|
||||
@@ -312,7 +314,7 @@ void BOPAlgo_PaveFiller::PerformEE()
|
||||
continue;
|
||||
}
|
||||
//
|
||||
Standard_Boolean bIsOnPave[4], bFlag;
|
||||
Standard_Boolean bIsOnPave[4];
|
||||
Standard_Integer nV[4], j;
|
||||
Standard_Real aT1, aT2, aTol;
|
||||
TopoDS_Vertex aVnew;
|
||||
@@ -343,23 +345,50 @@ void BOPAlgo_PaveFiller::PerformEE()
|
||||
continue;
|
||||
}
|
||||
//
|
||||
bFlag = Standard_False;
|
||||
for (j = 0; j < 4; ++j) {
|
||||
if (bIsOnPave[j]) {
|
||||
//add interf VE(nV[j], nE)
|
||||
Standard_Boolean isVExists = Standard_False;
|
||||
for (j = 0; j < 4; ++j)
|
||||
{
|
||||
if (bIsOnPave[j])
|
||||
{
|
||||
Handle(BOPDS_PaveBlock)& aPB = (j < 2) ? aPB2 : aPB1;
|
||||
bFlag = ForceInterfVE(nV[j], aPB, aMEdges);
|
||||
break;
|
||||
bIsOnPave[j] = ForceInterfVE(nV[j], aPB, aMEdges);
|
||||
if (bIsOnPave[j]) isVExists = Standard_True;
|
||||
}
|
||||
}
|
||||
if (bFlag) {
|
||||
BOPDS_InterfEE& aEE = aEEs.Appended();
|
||||
aEE.SetIndices(nE1, nE2);
|
||||
aEE.SetCommonPart(aCPart);
|
||||
continue;
|
||||
}
|
||||
//
|
||||
|
||||
BOPTools_AlgoTools::MakeNewVertex(aE1, aT1, aE2, aT2, aVnew);
|
||||
const gp_Pnt aPnew = BRep_Tool::Pnt(aVnew);
|
||||
|
||||
if (isVExists)
|
||||
{
|
||||
// The found intersection point is located closely to one of the
|
||||
// pave blocks bounds. So, do not create the new vertex in this point.
|
||||
// Check if this point is a real intersection point or just a touching point.
|
||||
// If it is a touching point, do nothing.
|
||||
// If it is an intersection point, update the existing vertex to cover the
|
||||
// intersection point.
|
||||
const gp_Pnt aPOnE1 = BRepAdaptor_Curve(aE1).Value(aT1);
|
||||
const gp_Pnt aPOnE2 = BRepAdaptor_Curve(aE2).Value(aT2);
|
||||
if (aPOnE1.Distance(aPOnE2) > Precision::Intersection())
|
||||
// No intersection point
|
||||
continue;
|
||||
|
||||
// Real intersection is present.
|
||||
// Update the existing vertex to cover the intersection point.
|
||||
for (j = 0; j < 4; ++j)
|
||||
{
|
||||
if (bIsOnPave[j])
|
||||
{
|
||||
const TopoDS_Vertex& aV = TopoDS::Vertex(myDS->Shape(nV[j]));
|
||||
const gp_Pnt aP = BRep_Tool::Pnt(aV);
|
||||
Standard_Real aDistPP = aP.Distance(aPnew);
|
||||
// Just update the vertex
|
||||
UpdateVertex(nV[j], aDistPP);
|
||||
myVertsToAvoidExtension.Add(nV[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Standard_Real aTolVnew = BRep_Tool::Tolerance(aVnew);
|
||||
if (bAnalytical) {
|
||||
// increase tolerance for Line/Line intersection, but do not update
|
||||
@@ -375,7 +404,7 @@ void BOPAlgo_PaveFiller::PerformEE()
|
||||
Standard_Integer nVS[2], iFound;
|
||||
Standard_Real aTolVx, aD2, aDT2;
|
||||
TColStd_MapOfInteger aMV;
|
||||
gp_Pnt aPnew, aPx;
|
||||
gp_Pnt aPx;
|
||||
//
|
||||
iFound=0;
|
||||
j=-1;
|
||||
@@ -391,8 +420,6 @@ void BOPAlgo_PaveFiller::PerformEE()
|
||||
nVS[j]=nV[3];
|
||||
}
|
||||
//
|
||||
aPnew=BRep_Tool::Pnt(aVnew);
|
||||
//
|
||||
for (Standard_Integer k1=0; k1<=j; ++k1) {
|
||||
const TopoDS_Vertex& aVx= *(TopoDS_Vertex*)&(myDS->Shape(nVS[k1]));
|
||||
aTolVx=BRep_Tool::Tolerance(aVx);
|
||||
@@ -459,7 +486,10 @@ void BOPAlgo_PaveFiller::PerformEE()
|
||||
//=========================================
|
||||
// post treatment
|
||||
//=========================================
|
||||
BOPAlgo_Tools::PerformCommonBlocks(aMPBLPB, aAllocator, myDS);
|
||||
BOPAlgo_Tools::PerformCommonBlocks(aMPBLPB, aAllocator, myDS, myContext);
|
||||
// Update vertices of common blocks with real CB tolerances
|
||||
UpdateVerticesOfCB();
|
||||
|
||||
PerformNewVertices(aMVCPB, aAllocator);
|
||||
//
|
||||
if (aMEdges.Extent()) {
|
||||
@@ -598,8 +628,11 @@ void BOPAlgo_PaveFiller::FillShrunkData(Handle(BOPDS_PaveBlock)& thePB)
|
||||
thePB->Indices(nV1, nV2);
|
||||
const TopoDS_Vertex& aV1=(*(TopoDS_Vertex *)(&myDS->Shape(nV1)));
|
||||
const TopoDS_Vertex& aV2=(*(TopoDS_Vertex *)(&myDS->Shape(nV2)));
|
||||
// Original edge
|
||||
// Get the edge
|
||||
Standard_Integer nE = thePB->OriginalEdge();
|
||||
if (nE < 0 && !thePB->HasEdge(nE))
|
||||
return;
|
||||
|
||||
const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&myDS->Shape(nE)));
|
||||
// Range
|
||||
Standard_Real aT1, aT2;
|
||||
@@ -628,7 +661,7 @@ void BOPAlgo_PaveFiller::AnalyzeShrunkData(const Handle(BOPDS_PaveBlock)& thePB,
|
||||
BRep_Tool::Range(theSR.Edge(), aEFirst, aELast);
|
||||
thePB->Range(aPBFirst, aPBLast);
|
||||
bWholeEdge = !(aPBFirst > aEFirst || aPBLast < aELast);
|
||||
if (bWholeEdge) {
|
||||
if (bWholeEdge && thePB->OriginalEdge() >= 0) {
|
||||
aWarnShape = theSR.Edge();
|
||||
}
|
||||
else {
|
||||
@@ -678,20 +711,20 @@ Standard_Boolean BOPAlgo_PaveFiller::ForceInterfVE(const Standard_Integer nV,
|
||||
//
|
||||
const BOPDS_ShapeInfo& aSIE=myDS->ShapeInfo(nE);
|
||||
if (aSIE.HasSubShape(nV)) {
|
||||
return Standard_False;
|
||||
return Standard_True;
|
||||
}
|
||||
//
|
||||
if (myDS->HasInterf(nV, nE)) {
|
||||
return Standard_False;
|
||||
return Standard_True;
|
||||
}
|
||||
//
|
||||
if (myDS->HasInterfShapeSubShapes(nV, nE)) {
|
||||
return Standard_False;
|
||||
return Standard_True;
|
||||
}
|
||||
//
|
||||
if (aPB->Pave1().Index() == nV ||
|
||||
aPB->Pave2().Index() == nV) {
|
||||
return Standard_False;
|
||||
return Standard_True;
|
||||
}
|
||||
//
|
||||
nVx = nV;
|
||||
@@ -787,6 +820,41 @@ Standard_Boolean BOPAlgo_PaveFiller::GetPBBox(const TopoDS_Edge& theE,
|
||||
return bValid;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : UpdateVerticesOfCB
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void BOPAlgo_PaveFiller::UpdateVerticesOfCB()
|
||||
{
|
||||
// Fence map to avoid checking same Common block twice
|
||||
BOPDS_MapOfPaveBlock aMPBFence;
|
||||
|
||||
BOPDS_VectorOfListOfPaveBlock& aPBP = myDS->ChangePaveBlocksPool();
|
||||
const Standard_Integer aNbPBP = aPBP.Length();
|
||||
for (Standard_Integer i = 0; i < aNbPBP; ++i)
|
||||
{
|
||||
const BOPDS_ListOfPaveBlock& aLPB = aPBP(i);
|
||||
BOPDS_ListIteratorOfListOfPaveBlock itPB(aLPB);
|
||||
for (; itPB.More(); itPB.Next())
|
||||
{
|
||||
const Handle(BOPDS_CommonBlock)& aCB = myDS->CommonBlock(itPB.Value());
|
||||
if (aCB.IsNull())
|
||||
continue;
|
||||
|
||||
const Handle(BOPDS_PaveBlock)& aPBR = aCB->PaveBlock1();
|
||||
if (!aMPBFence.Add(aPBR))
|
||||
continue;
|
||||
|
||||
Standard_Real aTolCB = aCB->Tolerance();
|
||||
if (aTolCB > 0.)
|
||||
{
|
||||
UpdateVertex(aPBR->Pave1().Index(), aTolCB);
|
||||
UpdateVertex(aPBR->Pave2().Index(), aTolCB);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : ForceInterfEE
|
||||
//purpose :
|
||||
@@ -794,28 +862,27 @@ Standard_Boolean BOPAlgo_PaveFiller::GetPBBox(const TopoDS_Edge& theE,
|
||||
void BOPAlgo_PaveFiller::ForceInterfEE()
|
||||
{
|
||||
// Now that we have vertices increased and unified, try to find additional
|
||||
// common blocks among the pairs of edges that did not participate in
|
||||
// intersection (PerformEE() method) due to being rejected by bounding boxes.
|
||||
// Here, we are interested in common blocks only, as all real intersections
|
||||
// should have happened already. Thus, we need to look only for the same
|
||||
// vertices in the pairs of pave blocks and check the coincidence of such pave blocks.
|
||||
// common blocks among the pairs of edges.
|
||||
// Since all real intersections should have already happened, here we
|
||||
// are interested in common blocks only, thus we need to check only
|
||||
// those pairs of pave blocks with the same bounding vertices.
|
||||
|
||||
Handle(NCollection_IncAllocator) anAlloc = new NCollection_IncAllocator;
|
||||
|
||||
// Initialize pave blocks for all SD vertices
|
||||
// Initialize pave blocks for all vertices which participated in intersections
|
||||
const Standard_Integer aNbS = myDS->NbSourceShapes();
|
||||
for (Standard_Integer i = 0; i < aNbS; ++i)
|
||||
{
|
||||
const BOPDS_ShapeInfo& aSI = myDS->ShapeInfo(i);
|
||||
if (aSI.ShapeType() == TopAbs_VERTEX)
|
||||
{
|
||||
Standard_Integer nVSD;
|
||||
if (myDS->HasShapeSD(i, nVSD))
|
||||
if (myDS->HasInterf(i))
|
||||
myDS->InitPaveBlocksForVertex(i);
|
||||
}
|
||||
}
|
||||
|
||||
// Find all Pave Blocks with both paves being SD vertices.
|
||||
// Fill the connection map from bounding vertices to pave blocks
|
||||
// having those bounding vertices
|
||||
NCollection_IndexedDataMap<BOPDS_Pair,
|
||||
BOPDS_ListOfPaveBlock,
|
||||
BOPDS_PairMapHasher> aPBMap(1, anAlloc);
|
||||
@@ -863,8 +930,7 @@ void BOPAlgo_PaveFiller::ForceInterfEE()
|
||||
if (!aNbPB)
|
||||
return;
|
||||
|
||||
// Find pairs of Pave Blocks having the same SD vertices
|
||||
// and put them into the vector for parallel intersection.
|
||||
// Prepare pave blocks with the same vertices for intersection.
|
||||
BOPAlgo_VectorOfEdgeEdge aVEdgeEdge;
|
||||
|
||||
for (Standard_Integer i = 1; i <= aNbPB; ++i)
|
||||
@@ -892,9 +958,16 @@ void BOPAlgo_PaveFiller::ForceInterfEE()
|
||||
const Handle(BOPDS_PaveBlock)& aPB1 = aItLPB1.Value();
|
||||
const Handle(BOPDS_CommonBlock)& aCB1 = myDS->CommonBlock(aPB1);
|
||||
const Standard_Integer nE1 = aPB1->OriginalEdge();
|
||||
const Standard_Integer iR1 = myDS->Rank(nE1);
|
||||
const TopoDS_Edge& aE1 = TopoDS::Edge(myDS->Shape(nE1));
|
||||
Standard_Real aT11, aT12;
|
||||
aPB1->Range(aT11, aT12);
|
||||
BRepAdaptor_Curve aBAC1(aE1);
|
||||
gp_Pnt aPm;
|
||||
gp_Vec aVTgt1;
|
||||
aBAC1.D1((aT11 + aT12) * 0.5, aPm, aVTgt1);
|
||||
if (aVTgt1.SquareMagnitude() < gp::Resolution())
|
||||
continue;
|
||||
|
||||
BOPDS_ListIteratorOfListOfPaveBlock aItLPB2 = aItLPB1;
|
||||
for (aItLPB2.Next(); aItLPB2.More(); aItLPB2.Next())
|
||||
@@ -902,10 +975,18 @@ void BOPAlgo_PaveFiller::ForceInterfEE()
|
||||
const Handle(BOPDS_PaveBlock)& aPB2 = aItLPB2.Value();
|
||||
const Handle(BOPDS_CommonBlock)& aCB2 = myDS->CommonBlock(aPB2);
|
||||
const Standard_Integer nE2 = aPB2->OriginalEdge();
|
||||
const Standard_Integer iR2 = myDS->Rank(nE2);
|
||||
|
||||
// Make sure that the edges came from different arguments
|
||||
if (myDS->Rank(nE1) == myDS->Rank(nE2))
|
||||
continue;
|
||||
// Check that the edges came from different arguments
|
||||
if (iR1 == iR2)
|
||||
{
|
||||
// If the sharing of the vertices is not original, but has been acquired
|
||||
// during the operation, check the coincidence of the edges even if
|
||||
// they came from the same argument
|
||||
if ((!myDS->IsNewShape(nV1) && (myDS->Rank(nV1) == iR1)) ||
|
||||
(!myDS->IsNewShape(nV2) && (myDS->Rank(nV2) == iR2)))
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check that the Pave blocks do not form the Common block already
|
||||
if (!aCB1.IsNull() && !aCB2.IsNull())
|
||||
@@ -918,6 +999,28 @@ void BOPAlgo_PaveFiller::ForceInterfEE()
|
||||
Standard_Real aT21, aT22;
|
||||
aPB2->Range(aT21, aT22);
|
||||
|
||||
// Check the angle between edges in the middle point.
|
||||
// If the angle is more than 10 degrees, do not use the additional
|
||||
// tolerance, as it may lead to undesired unification of edges
|
||||
Standard_Boolean bUseAddTol = Standard_True;
|
||||
{
|
||||
GeomAPI_ProjectPointOnCurve& aProjPC = myContext->ProjPC(aE2);
|
||||
aProjPC.Perform(aPm);
|
||||
if (!aProjPC.NbPoints())
|
||||
continue;
|
||||
|
||||
BRepAdaptor_Curve aBAC2(aE2);
|
||||
gp_Pnt aPm2;
|
||||
gp_Vec aVTgt2;
|
||||
aBAC2.D1(aProjPC.LowerDistanceParameter(), aPm2, aVTgt2);
|
||||
if (aVTgt2.SquareMagnitude() < gp::Resolution())
|
||||
continue;
|
||||
// The angle should be close to zero
|
||||
Standard_Real aCos = aVTgt1.Dot(aVTgt2);
|
||||
if (Abs(aCos) < 0.984)
|
||||
bUseAddTol = Standard_False;
|
||||
}
|
||||
|
||||
// Add pair for intersection
|
||||
BOPAlgo_EdgeEdge& anEdgeEdge = aVEdgeEdge.Appended();
|
||||
anEdgeEdge.UseQuickCoincidenceCheck(Standard_True);
|
||||
@@ -925,7 +1028,10 @@ void BOPAlgo_PaveFiller::ForceInterfEE()
|
||||
anEdgeEdge.SetPaveBlock2(aPB2);
|
||||
anEdgeEdge.SetEdge1(aE1, aT11, aT12);
|
||||
anEdgeEdge.SetEdge2(aE2, aT21, aT22);
|
||||
anEdgeEdge.SetFuzzyValue(myFuzzyValue + aTolAdd);
|
||||
if (bUseAddTol)
|
||||
anEdgeEdge.SetFuzzyValue(myFuzzyValue + aTolAdd);
|
||||
else
|
||||
anEdgeEdge.SetFuzzyValue(myFuzzyValue);
|
||||
anEdgeEdge.SetProgressIndicator(myProgressIndicator);
|
||||
}
|
||||
}
|
||||
@@ -975,6 +1081,16 @@ void BOPAlgo_PaveFiller::ForceInterfEE()
|
||||
const Standard_Integer nE1 = aPB[0]->OriginalEdge();
|
||||
const Standard_Integer nE2 = aPB[1]->OriginalEdge();
|
||||
|
||||
if (myDS->Rank(nE1) == myDS->Rank(nE2))
|
||||
{
|
||||
// Add acquired self-interference warning
|
||||
TopoDS_Compound aWC;
|
||||
BRep_Builder().MakeCompound(aWC);
|
||||
BRep_Builder().Add(aWC, myDS->Shape(nE1));
|
||||
BRep_Builder().Add(aWC, myDS->Shape(nE2));
|
||||
AddWarning(new BOPAlgo_AlertAcquiredSelfIntersection(aWC));
|
||||
}
|
||||
|
||||
BOPDS_InterfEE& aEE = aEEs.Appended();
|
||||
aEE.SetIndices(nE1, nE2);
|
||||
aEE.SetCommonPart(aCP);
|
||||
|
@@ -184,6 +184,10 @@ void BOPAlgo_PaveFiller::PerformVF()
|
||||
//
|
||||
aVFs.SetIncrement(iSize);
|
||||
//
|
||||
// Avoid repeated intersection of the same vertex with face in case
|
||||
// the group of vertices formed a single SD vertex
|
||||
NCollection_DataMap<BOPDS_Pair, TColStd_MapOfInteger, BOPDS_PairMapHasher> aMVFPairs;
|
||||
|
||||
for (; myIterator->More(); myIterator->Next()) {
|
||||
myIterator->Value(nV, nF);
|
||||
//
|
||||
@@ -191,6 +195,10 @@ void BOPAlgo_PaveFiller::PerformVF()
|
||||
continue;
|
||||
}
|
||||
//
|
||||
if (myDS->HasInterf(nV, nF)) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
myDS->ChangeFaceInfo(nF);
|
||||
if (myDS->HasInterfShapeSubShapes(nV, nF)) {
|
||||
continue;
|
||||
@@ -201,12 +209,23 @@ void BOPAlgo_PaveFiller::PerformVF()
|
||||
nVx=nVSD;
|
||||
}
|
||||
//
|
||||
BOPDS_Pair aVFPair(nVx, nF);
|
||||
TColStd_MapOfInteger* pMV = aMVFPairs.ChangeSeek(aVFPair);
|
||||
if (pMV)
|
||||
{
|
||||
pMV->Add(nV);
|
||||
continue;
|
||||
}
|
||||
|
||||
pMV = aMVFPairs.Bound(aVFPair, TColStd_MapOfInteger());
|
||||
pMV->Add(nV);
|
||||
|
||||
const TopoDS_Vertex& aV=(*(TopoDS_Vertex *)(&myDS->Shape(nVx)));
|
||||
const TopoDS_Face& aF=(*(TopoDS_Face *)(&myDS->Shape(nF)));
|
||||
//
|
||||
BOPAlgo_VertexFace& aVertexFace=aVVF.Appended();
|
||||
//
|
||||
aVertexFace.SetIndices(nV, nF);
|
||||
aVertexFace.SetIndices(nVx, nF);
|
||||
aVertexFace.SetVertex(aV);
|
||||
aVertexFace.SetFace(aF);
|
||||
aVertexFace.SetFuzzyValue(myFuzzyValue);
|
||||
@@ -231,22 +250,30 @@ void BOPAlgo_PaveFiller::PerformVF()
|
||||
continue;
|
||||
}
|
||||
//
|
||||
aVertexFace.Indices(nV, nF);
|
||||
aVertexFace.Indices(nVx, nF);
|
||||
aVertexFace.Parameters(aT1, aT2);
|
||||
// 1
|
||||
BOPDS_InterfVF& aVF=aVFs.Appended();
|
||||
aVF.SetIndices(nV, nF);
|
||||
aVF.SetUV(aT1, aT2);
|
||||
// 2
|
||||
myDS->AddInterf(nV, nF);
|
||||
//
|
||||
// 3 update vertex V/F if necessary
|
||||
Standard_Real aTolVNew = aVertexFace.VertexNewTolerance();
|
||||
nVx=UpdateVertex(nV, aTolVNew);
|
||||
//
|
||||
// 4
|
||||
if (myDS->IsNewShape(nVx)) {
|
||||
aVF.SetIndexNew(nVx);
|
||||
|
||||
BOPDS_Pair aVFPair(nVx, nF);
|
||||
const TColStd_MapOfInteger& aMV = aMVFPairs.Find(aVFPair);
|
||||
TColStd_MapIteratorOfMapOfInteger itMV(aMV);
|
||||
for (; itMV.More(); itMV.Next())
|
||||
{
|
||||
nV = itMV.Value();
|
||||
// 1
|
||||
BOPDS_InterfVF& aVF = aVFs.Appended();
|
||||
aVF.SetIndices(nV, nF);
|
||||
aVF.SetUV(aT1, aT2);
|
||||
// 2
|
||||
myDS->AddInterf(nV, nF);
|
||||
//
|
||||
// 3 update vertex V/F if necessary
|
||||
nVx = UpdateVertex(nV, aTolVNew);
|
||||
//
|
||||
// 4
|
||||
if (myDS->IsNewShape(nVx)) {
|
||||
aVF.SetIndexNew(nVx);
|
||||
}
|
||||
}
|
||||
// 5 update FaceInfo
|
||||
BOPDS_FaceInfo& aFI=myDS->ChangeFaceInfo(nF);
|
||||
|
@@ -30,10 +30,13 @@
|
||||
#include <BOPDS_Pave.hxx>
|
||||
#include <BOPDS_PaveBlock.hxx>
|
||||
#include <BOPTools_AlgoTools.hxx>
|
||||
#include <BOPTools_AlgoTools2D.hxx>
|
||||
#include <BOPTools_BoxSelector.hxx>
|
||||
#include <BOPTools_Parallel.hxx>
|
||||
#include <BRep_Builder.hxx>
|
||||
#include <BRep_Tool.hxx>
|
||||
#include <BRepAdaptor_Curve.hxx>
|
||||
#include <GeomAPI_ProjectPointOnSurf.hxx>
|
||||
#include <gp_Pnt.hxx>
|
||||
#include <IntTools_CommonPrt.hxx>
|
||||
#include <IntTools_Context.hxx>
|
||||
@@ -41,6 +44,7 @@
|
||||
#include <IntTools_Range.hxx>
|
||||
#include <IntTools_SequenceOfCommonPrts.hxx>
|
||||
#include <IntTools_Tools.hxx>
|
||||
#include <NCollection_IncAllocator.hxx>
|
||||
#include <NCollection_Vector.hxx>
|
||||
#include <Precision.hxx>
|
||||
#include <TColStd_MapOfInteger.hxx>
|
||||
@@ -251,7 +255,11 @@ void BOPAlgo_PaveFiller::PerformEF()
|
||||
BOPTools_AlgoTools::CorrectRange(aE, aF, aSR, aPBRange);
|
||||
aEdgeFace.SetRange (aPBRange);
|
||||
aEdgeFace.SetProgressIndicator(myProgressIndicator);
|
||||
//
|
||||
// Save the pair to avoid their forced intersection
|
||||
BOPDS_MapOfPaveBlock* pMPB = myFPBDone.ChangeSeek(nF);
|
||||
if (!pMPB)
|
||||
pMPB = myFPBDone.Bound(nF, BOPDS_MapOfPaveBlock());
|
||||
pMPB->Add(aPB);
|
||||
}//for (; aIt.More(); aIt.Next()) {
|
||||
}//for (; myIterator->More(); myIterator->Next()) {
|
||||
//
|
||||
@@ -354,72 +362,86 @@ void BOPAlgo_PaveFiller::PerformEF()
|
||||
continue;
|
||||
}
|
||||
//
|
||||
for (j=0; j<2; ++j) {
|
||||
if (bIsOnPave[j]) {
|
||||
bV[j]=CheckFacePaves(nV[j], aMIFOn, aMIFIn);
|
||||
if (bV[j]) {
|
||||
const TopoDS_Vertex& aV=
|
||||
(*(TopoDS_Vertex *)(&myDS->Shape(nV[j])));
|
||||
//
|
||||
Standard_Real f, l, aTolVnew, aDistPP, aTolPC, aTolV;
|
||||
//
|
||||
const Handle(Geom_Curve)& aCur = BRep_Tool::Curve(aE, f, l);
|
||||
//
|
||||
gp_Pnt aP1 = BRep_Tool::Pnt(aV);
|
||||
gp_Pnt aP2 = aCur->Value(aT);
|
||||
//
|
||||
aDistPP=aP1.Distance(aP2);
|
||||
//
|
||||
aTolPC=Precision::PConfusion();
|
||||
aTolV=BRep_Tool::Tolerance(aV);
|
||||
if (aDistPP > (aTolV+aTolPC)) {
|
||||
aTolVnew=Max(aTolE, aDistPP);
|
||||
UpdateVertex(nV[j], aTolVnew);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (j = 0; j < 2; ++j)
|
||||
{
|
||||
if (bIsOnPave[j])
|
||||
{
|
||||
bV[j] = CheckFacePaves(nV[j], aMIFOn, aMIFIn);
|
||||
if (!bV[j])
|
||||
bIsOnPave[j] = ForceInterfVF(nV[j], nF);
|
||||
}
|
||||
}
|
||||
|
||||
if (bIsOnPave[0] || bIsOnPave[1])
|
||||
{
|
||||
// The found intersection point is located closely to one of the pave block's
|
||||
// bounds. So, do not create the new vertex in this point.
|
||||
// Check if this point is a real intersection, or just a touching point.
|
||||
// If it is a touching point, do nothing.
|
||||
// If it is an intersection point, update the existing vertex to cover the
|
||||
// intersection point.
|
||||
GeomAPI_ProjectPointOnSurf& aProjPS = myContext->ProjPS(aF);
|
||||
const gp_Pnt aPnew = BRep_Tool::Pnt(aVnew);
|
||||
aProjPS.Perform(aPnew);
|
||||
Standard_Real aMinDistEF = (aProjPS.IsDone() && aProjPS.NbPoints()) ?
|
||||
aProjPS.LowerDistance() : Precision::Infinite();
|
||||
Standard_Boolean hasRealIntersection = aMinDistEF < Precision::Intersection();
|
||||
|
||||
if (!hasRealIntersection)
|
||||
// no intersection point
|
||||
continue;
|
||||
|
||||
// Real intersection is present.
|
||||
// Update the existing vertex to cover the intersection point.
|
||||
for (j = 0; j < 2; ++j)
|
||||
{
|
||||
if (bIsOnPave[j])
|
||||
{
|
||||
const TopoDS_Vertex& aV = TopoDS::Vertex(myDS->Shape(nV[j]));
|
||||
const gp_Pnt aP = BRep_Tool::Pnt(aV);
|
||||
Standard_Real aDistPP = aP.Distance(aPnew);
|
||||
UpdateVertex(nV[j], aDistPP);
|
||||
myVertsToAvoidExtension.Add(nV[j]);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (CheckFacePaves(aVnew, aMIFOn)) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
if (!bIsOnPave[0] && !bIsOnPave[1]) {
|
||||
if (CheckFacePaves(aVnew, aMIFOn)) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
Standard_Real aTolVnew = BRep_Tool::Tolerance(aVnew);
|
||||
aTolVnew = Max(aTolVnew, Max(aTolE, aTolF));
|
||||
BRep_Builder().UpdateVertex(aVnew, aTolVnew);
|
||||
if (bLinePlane) {
|
||||
// increase tolerance for Line/Plane intersection, but do not update
|
||||
// the vertex till its intersection with some other shape
|
||||
IntTools_Range aCR = aCPart.Range1();
|
||||
aTolVnew = Max(aTolVnew, (aCR.Last() - aCR.First()) / 2.);
|
||||
}
|
||||
//
|
||||
const gp_Pnt& aPnew = BRep_Tool::Pnt(aVnew);
|
||||
//
|
||||
if (!myContext->IsPointInFace(aPnew, aF, aTolVnew)) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
aMIEFC.Add(nF);
|
||||
// 1
|
||||
BOPDS_InterfEF& aEF=aEFs.Appended();
|
||||
iX=aEFs.Length()-1;
|
||||
aEF.SetIndices(nE, nF);
|
||||
aEF.SetCommonPart(aCPart);
|
||||
// 2
|
||||
myDS->AddInterf(nE, nF);
|
||||
// 3
|
||||
BOPDS_CoupleOfPaveBlocks aCPB;
|
||||
//
|
||||
aCPB.SetPaveBlocks(aPB, aPB);
|
||||
aCPB.SetIndexInterf(iX);
|
||||
aCPB.SetTolerance(aTolVnew);
|
||||
aMVCPB.Add(aVnew, aCPB);
|
||||
Standard_Real aTolVnew = BRep_Tool::Tolerance(aVnew);
|
||||
aTolVnew = Max(aTolVnew, Max(aTolE, aTolF));
|
||||
BRep_Builder().UpdateVertex(aVnew, aTolVnew);
|
||||
if (bLinePlane) {
|
||||
// increase tolerance for Line/Plane intersection, but do not update
|
||||
// the vertex till its intersection with some other shape
|
||||
IntTools_Range aCR = aCPart.Range1();
|
||||
aTolVnew = Max(aTolVnew, (aCR.Last() - aCR.First()) / 2.);
|
||||
}
|
||||
//
|
||||
const gp_Pnt& aPnew = BRep_Tool::Pnt(aVnew);
|
||||
//
|
||||
if (!myContext->IsPointInFace(aPnew, aF, aTolVnew)) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
aMIEFC.Add(nF);
|
||||
// 1
|
||||
BOPDS_InterfEF& aEF = aEFs.Appended();
|
||||
iX = aEFs.Length() - 1;
|
||||
aEF.SetIndices(nE, nF);
|
||||
aEF.SetCommonPart(aCPart);
|
||||
// 2
|
||||
myDS->AddInterf(nE, nF);
|
||||
// 3
|
||||
BOPDS_CoupleOfPaveBlocks aCPB;
|
||||
//
|
||||
aCPB.SetPaveBlocks(aPB, aPB);
|
||||
aCPB.SetIndexInterf(iX);
|
||||
aCPB.SetTolerance(aTolVnew);
|
||||
aMVCPB.Add(aVnew, aCPB);
|
||||
}
|
||||
break;
|
||||
case TopAbs_EDGE: {
|
||||
@@ -453,7 +475,8 @@ void BOPAlgo_PaveFiller::PerformEF()
|
||||
//=========================================
|
||||
// post treatment
|
||||
//=========================================
|
||||
BOPAlgo_Tools::PerformCommonBlocks(aMPBLI, aAllocator, myDS);
|
||||
BOPAlgo_Tools::PerformCommonBlocks(aMPBLI, aAllocator, myDS, myContext);
|
||||
UpdateVerticesOfCB();
|
||||
PerformNewVertices(aMVCPB, aAllocator, Standard_False);
|
||||
//
|
||||
// Update FaceInfoIn for all faces having EF common parts
|
||||
@@ -662,3 +685,343 @@ void BOPAlgo_PaveFiller::ReduceIntersectionRange(const Standard_Integer theV1,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : ForceInterfEF
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void BOPAlgo_PaveFiller::ForceInterfEF()
|
||||
{
|
||||
if (!myIsPrimary)
|
||||
return;
|
||||
|
||||
// Now that we have vertices increased and unified, try to find additional
|
||||
// edge/face common blocks among the pairs of edge/face.
|
||||
// Here, we are interested in common blocks only, as all real intersections
|
||||
// should have happened already. Thus, we need to check only those pairs
|
||||
// of edge/face which have the same vertices.
|
||||
|
||||
// Collect all pave blocks
|
||||
BOPDS_IndexedMapOfPaveBlock aMPB;
|
||||
const Standard_Integer aNbS = myDS->NbSourceShapes();
|
||||
for (Standard_Integer nE = 0; nE < aNbS; ++nE)
|
||||
{
|
||||
const BOPDS_ShapeInfo& aSI = myDS->ShapeInfo(nE);
|
||||
if (aSI.ShapeType() != TopAbs_EDGE)
|
||||
// Not an edge
|
||||
continue;
|
||||
|
||||
if (!aSI.HasReference())
|
||||
// Edge has no pave blocks
|
||||
continue;
|
||||
|
||||
if (aSI.HasFlag())
|
||||
// Degenerated edge
|
||||
continue;
|
||||
|
||||
const BOPDS_ListOfPaveBlock& aLPB = myDS->PaveBlocks(nE);
|
||||
BOPDS_ListIteratorOfListOfPaveBlock aItLPB(aLPB);
|
||||
for (; aItLPB.More(); aItLPB.Next())
|
||||
{
|
||||
const Handle(BOPDS_PaveBlock)& aPB = aItLPB.Value();
|
||||
const Handle(BOPDS_PaveBlock)& aPBR = myDS->RealPaveBlock(aPB);
|
||||
aMPB.Add(aPBR);
|
||||
}
|
||||
}
|
||||
|
||||
// Perform intersection of collected pave blocks with faces
|
||||
ForceInterfEF(aMPB, Standard_True);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : ForceInterfEF
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void BOPAlgo_PaveFiller::ForceInterfEF(const BOPDS_IndexedMapOfPaveBlock& theMPB,
|
||||
const Standard_Boolean theAddInterf)
|
||||
{
|
||||
if (theMPB.IsEmpty())
|
||||
return;
|
||||
|
||||
// Fill the tree with bounding boxes of the pave blocks
|
||||
NCollection_UBTree<Standard_Integer, Bnd_Box> aBBTree;
|
||||
NCollection_UBTreeFiller<Standard_Integer, Bnd_Box> aTreeFiller(aBBTree);
|
||||
|
||||
Handle(NCollection_IncAllocator) anAlloc = new NCollection_IncAllocator;
|
||||
BOPDS_IndexedMapOfPaveBlock aPBMap(1, anAlloc);
|
||||
|
||||
Standard_Integer aNbPB = theMPB.Extent();
|
||||
for (Standard_Integer iPB = 1; iPB <= aNbPB; ++iPB)
|
||||
{
|
||||
Handle(BOPDS_PaveBlock) aPB = theMPB(iPB);
|
||||
if (!aPB->HasShrunkData() || !myDS->IsValidShrunkData(aPB))
|
||||
{
|
||||
FillShrunkData(aPB);
|
||||
if (!aPB->HasShrunkData())
|
||||
continue;
|
||||
}
|
||||
|
||||
Standard_Real f, l;
|
||||
Bnd_Box aPBBox;
|
||||
Standard_Boolean isSplit;
|
||||
aPB->ShrunkData(f, l, aPBBox, isSplit);
|
||||
|
||||
aTreeFiller.Add(aPBMap.Add(aPB), aPBBox);
|
||||
}
|
||||
|
||||
// Shake the tree
|
||||
aTreeFiller.Fill();
|
||||
|
||||
// Find pairs of Face/PaveBlock containing the same vertices
|
||||
// and prepare those pairs for intersection.
|
||||
BOPAlgo_VectorOfEdgeFace aVEdgeFace;
|
||||
|
||||
const Standard_Integer aNbS = myDS->NbSourceShapes();
|
||||
for (Standard_Integer nF = 0; nF < aNbS; ++nF)
|
||||
{
|
||||
const BOPDS_ShapeInfo& aSI = myDS->ShapeInfo(nF);
|
||||
if (aSI.ShapeType() != TopAbs_FACE)
|
||||
// Not a face
|
||||
continue;
|
||||
|
||||
if (!aSI.HasReference())
|
||||
// Face has no face info
|
||||
continue;
|
||||
|
||||
const Bnd_Box& aBoxF = aSI.Box();
|
||||
BOPTools_BoxSelector<Bnd_Box> aSelector;
|
||||
aSelector.SetBox(aBoxF);
|
||||
|
||||
if (!aBBTree.Select(aSelector))
|
||||
continue;
|
||||
|
||||
const TopoDS_Face& aF = TopoDS::Face(aSI.Shape());
|
||||
const BOPDS_FaceInfo& aFI = myDS->FaceInfo(nF);
|
||||
// Vertices of the face
|
||||
TColStd_MapOfInteger aMVF;
|
||||
const TColStd_MapOfInteger* pMVF[] = { &aFI.VerticesOn(),
|
||||
&aFI.VerticesIn(),
|
||||
&aFI.VerticesSc() };
|
||||
for (Standard_Integer iM = 0; iM < 3; ++iM)
|
||||
{
|
||||
TColStd_MapIteratorOfMapOfInteger itM(*pMVF[iM]);
|
||||
for (; itM.More(); itM.Next())
|
||||
aMVF.Add(itM.Value());
|
||||
}
|
||||
|
||||
// Pave Blocks of the face
|
||||
const BOPDS_IndexedMapOfPaveBlock* pMPBF[] = { &aFI.PaveBlocksOn(),
|
||||
&aFI.PaveBlocksIn(),
|
||||
&aFI.PaveBlocksSc() };
|
||||
for (Standard_Integer iM = 0; iM < 3; ++iM)
|
||||
{
|
||||
const Standard_Integer aNb = pMPBF[iM]->Extent();
|
||||
for (Standard_Integer iPB = 1; iPB <= aNb; ++iPB)
|
||||
{
|
||||
const Handle(BOPDS_PaveBlock)& aPB = pMPBF[iM]->FindKey(iPB);
|
||||
aMVF.Add(aPB->Pave1().Index());
|
||||
aMVF.Add(aPB->Pave2().Index());
|
||||
}
|
||||
}
|
||||
|
||||
// Projection tool
|
||||
GeomAPI_ProjectPointOnSurf& aProjPS = myContext->ProjPS(aF);
|
||||
|
||||
// Iterate on pave blocks and combine pairs containing
|
||||
// the same vertices
|
||||
const TColStd_ListOfInteger& aLIPB = aSelector.Indices();
|
||||
TColStd_ListOfInteger::Iterator itLIPB(aLIPB);
|
||||
for (; itLIPB.More(); itLIPB.Next())
|
||||
{
|
||||
const Handle(BOPDS_PaveBlock)& aPB = aPBMap(itLIPB.Value());
|
||||
if (pMPBF[0]->Contains(aPB) ||
|
||||
pMPBF[1]->Contains(aPB) ||
|
||||
pMPBF[2]->Contains(aPB))
|
||||
continue;
|
||||
|
||||
// Check if the face contains both vertices of the pave block
|
||||
Standard_Integer nV1, nV2;
|
||||
aPB->Indices(nV1, nV2);
|
||||
if (!aMVF.Contains(nV1) || !aMVF.Contains(nV2))
|
||||
// Face does not contain the vertices
|
||||
continue;
|
||||
|
||||
// Get the edge
|
||||
Standard_Integer nE;
|
||||
if (!aPB->HasEdge(nE))
|
||||
{
|
||||
nE = aPB->OriginalEdge();
|
||||
if (nE < 0)
|
||||
continue;
|
||||
|
||||
// Make sure that the edge and face came from different arguments
|
||||
if (myDS->Rank(nF) == myDS->Rank(nE))
|
||||
continue;
|
||||
}
|
||||
|
||||
const TopoDS_Edge& aE = TopoDS::Edge(myDS->Shape(nE));
|
||||
BRepAdaptor_Curve aBAC(aE);
|
||||
|
||||
// Check directions coincidence at middle point on the edge
|
||||
// and projection of that point on the face.
|
||||
// If the angle between tangent vector to the curve and normal
|
||||
// of the face is not in the range of 80 - 100 degrees, do not use the additional
|
||||
// tolerance, as it may lead to undesired unification of edge with the face.
|
||||
Standard_Boolean bUseAddTol = Standard_True;
|
||||
|
||||
Standard_Real aTS[2];
|
||||
Bnd_Box aPBBox;
|
||||
Standard_Boolean isSplit;
|
||||
aPB->ShrunkData(aTS[0], aTS[1], aPBBox, isSplit);
|
||||
|
||||
// Middle point
|
||||
gp_Pnt aPOnE;
|
||||
// Tangent vector in the middle point
|
||||
gp_Vec aVETgt;
|
||||
aBAC.D1(BOPTools_AlgoTools2D::IntermediatePoint(aTS[0], aTS[1]), aPOnE, aVETgt);
|
||||
if (aVETgt.SquareMagnitude() < gp::Resolution())
|
||||
continue;
|
||||
|
||||
aProjPS.Perform(aPOnE);
|
||||
if (!aProjPS.NbPoints())
|
||||
continue;
|
||||
|
||||
// Check the distance in the middle point, using the max vertices
|
||||
// tolerance as the criteria.
|
||||
const TopoDS_Vertex& aV1 = TopoDS::Vertex(myDS->Shape(nV1));
|
||||
const TopoDS_Vertex& aV2 = TopoDS::Vertex(myDS->Shape(nV2));
|
||||
Standard_Real aTolCheck = 2 * Max(BRep_Tool::Tolerance(aV1),
|
||||
BRep_Tool::Tolerance(aV2));
|
||||
|
||||
if (aProjPS.LowerDistance() > aTolCheck + myFuzzyValue)
|
||||
continue;
|
||||
|
||||
Standard_Real U, V;
|
||||
aProjPS.LowerDistanceParameters(U, V);
|
||||
if (!myContext->IsPointInFace(aF, gp_Pnt2d(U, V)))
|
||||
continue;
|
||||
|
||||
gp_Pnt aPOnS = aProjPS.NearestPoint();
|
||||
gp_Vec aVFNorm(aPOnS, aPOnE);
|
||||
if (aVFNorm.SquareMagnitude() > gp::Resolution())
|
||||
{
|
||||
// Angle between vectors should be close to 90 degrees.
|
||||
// We allow deviation of 10 degrees.
|
||||
Standard_Real aCos = aVFNorm.Dot(aVETgt);
|
||||
if (Abs(aCos) > 0.174)
|
||||
bUseAddTol = Standard_False;
|
||||
}
|
||||
|
||||
// Compute an addition to Fuzzy value
|
||||
Standard_Real aTolAdd = 0.0;
|
||||
if (bUseAddTol)
|
||||
{
|
||||
// Compute the distance from the bounding points of the edge
|
||||
// to the face and use the maximal of these distances as a
|
||||
// fuzzy tolerance for the intersection.
|
||||
// Use the maximal tolerance of the pave block's vertices
|
||||
// as a max criteria for the computed distance.
|
||||
|
||||
for (Standard_Integer iP = 0; iP < 2; ++iP)
|
||||
{
|
||||
gp_Pnt aP = aBAC.Value(aTS[iP]);
|
||||
aProjPS.Perform(aP);
|
||||
if (aProjPS.NbPoints())
|
||||
{
|
||||
Standard_Real aDistEF = aProjPS.LowerDistance();
|
||||
if (aDistEF < aTolCheck && aDistEF > aTolAdd)
|
||||
aTolAdd = aDistEF;
|
||||
}
|
||||
}
|
||||
if (aTolAdd > 0.)
|
||||
{
|
||||
aTolAdd -= (BRep_Tool::Tolerance(aE) + BRep_Tool::Tolerance(aF));
|
||||
if (aTolAdd < 0.)
|
||||
aTolAdd = 0.;
|
||||
}
|
||||
}
|
||||
|
||||
Standard_Boolean bIntersect = aTolAdd > 0;
|
||||
if (!bIntersect)
|
||||
{
|
||||
const BOPDS_MapOfPaveBlock* pMPB = myFPBDone.Seek(nF);
|
||||
bIntersect = !pMPB || !(pMPB->Contains(aPB));
|
||||
}
|
||||
|
||||
if (bIntersect)
|
||||
{
|
||||
// Prepare pair for intersection
|
||||
BOPAlgo_EdgeFace& aEdgeFace = aVEdgeFace.Appended();
|
||||
aEdgeFace.SetIndices(nE, nF);
|
||||
aEdgeFace.SetPaveBlock(aPB);
|
||||
aEdgeFace.SetEdge(aE);
|
||||
aEdgeFace.SetFace(aF);
|
||||
aEdgeFace.SetFuzzyValue(myFuzzyValue + aTolAdd);
|
||||
aEdgeFace.UseQuickCoincidenceCheck(Standard_True);
|
||||
aEdgeFace.SetRange(IntTools_Range(aPB->Pave1().Parameter(), aPB->Pave2().Parameter()));
|
||||
aEdgeFace.SetProgressIndicator(myProgressIndicator);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Standard_Integer aNbEFs = aVEdgeFace.Length();
|
||||
if (!aNbEFs)
|
||||
return;
|
||||
|
||||
aPBMap.Clear();
|
||||
anAlloc->Reset();
|
||||
|
||||
// Perform intersection of the found pairs
|
||||
BOPAlgo_EdgeFaceCnt::Perform(myRunParallel, aVEdgeFace, myContext);
|
||||
|
||||
BOPDS_VectorOfInterfEF& aEFs = myDS->InterfEF();
|
||||
if (theAddInterf && aEFs.IsEmpty())
|
||||
aEFs.SetIncrement(10);
|
||||
|
||||
// Analyze the results of intersection looking for TopAbs_EDGE
|
||||
// intersection type only.
|
||||
|
||||
// Collect all pairs for common block creation
|
||||
BOPDS_IndexedDataMapOfPaveBlockListOfInteger aMPBLI(1, anAlloc);
|
||||
|
||||
for (Standard_Integer i = 0; i < aNbEFs; ++i)
|
||||
{
|
||||
BOPAlgo_EdgeFace& anEdgeFace = aVEdgeFace(i);
|
||||
if (!anEdgeFace.IsDone() || anEdgeFace.HasErrors())
|
||||
{
|
||||
// Warn about failed intersection of sub-shapes
|
||||
AddIntersectionFailedWarning(anEdgeFace.Edge(), anEdgeFace.Face());
|
||||
continue;
|
||||
}
|
||||
|
||||
const IntTools_SequenceOfCommonPrts& aCParts = anEdgeFace.CommonParts();
|
||||
if (aCParts.Length() != 1)
|
||||
continue;
|
||||
|
||||
const IntTools_CommonPrt& aCP = aCParts(1);
|
||||
if (aCP.Type() != TopAbs_EDGE)
|
||||
continue;
|
||||
|
||||
Standard_Integer nE, nF;
|
||||
anEdgeFace.Indices(nE, nF);
|
||||
if (theAddInterf)
|
||||
{
|
||||
// Add interference
|
||||
BOPDS_InterfEF& aEF = aEFs.Appended();
|
||||
aEF.SetIndices(nE, nF);
|
||||
aEF.SetCommonPart(aCP);
|
||||
myDS->AddInterf(nE, nF);
|
||||
}
|
||||
|
||||
const Handle(BOPDS_PaveBlock)& aPB = anEdgeFace.PaveBlock();
|
||||
// Update face information with new IN pave block
|
||||
myDS->ChangeFaceInfo(nF).ChangePaveBlocksIn().Add(aPB);
|
||||
if (theAddInterf)
|
||||
// Fill map for common blocks creation
|
||||
BOPAlgo_Tools::FillMap(aPB, nF, aMPBLI, anAlloc);
|
||||
}
|
||||
|
||||
if (aMPBLI.Extent())
|
||||
// Create new common blocks for coinciding pairs
|
||||
BOPAlgo_Tools::PerformCommonBlocks(aMPBLI, anAlloc, myDS);
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -478,7 +478,7 @@ void BOPAlgo_PaveFiller::MakeSplitEdges()
|
||||
aCB->SetEdge(nE);
|
||||
// Compute tolerance of the common block and update the edge
|
||||
Standard_Real aTol = BOPAlgo_Tools::ComputeToleranceOfCB(aCB, myDS, myContext);
|
||||
myDS->UpdateEdgeTolerance(nE, aTol);
|
||||
UpdateEdgeTolerance(nE, aTol);
|
||||
}
|
||||
}
|
||||
else if (aLPB.Extent() == 1)
|
||||
@@ -527,10 +527,6 @@ void BOPAlgo_PaveFiller::MakeSplitEdges()
|
||||
BOPAlgo_SplitEdgeCnt::Perform(myRunParallel, aVBSE, myContext);
|
||||
//======================================================
|
||||
//
|
||||
BOPDS_ShapeInfo aSI;
|
||||
//
|
||||
aSI.SetShapeType(TopAbs_EDGE);
|
||||
//
|
||||
for (k=0; k < aNbVBSE; ++k) {
|
||||
BOPAlgo_SplitEdge& aBSE=aVBSE(k);
|
||||
//
|
||||
@@ -540,13 +536,18 @@ void BOPAlgo_PaveFiller::MakeSplitEdges()
|
||||
Handle(BOPDS_PaveBlock) aPBk=aBSE.PaveBlock();
|
||||
Handle(BOPDS_CommonBlock)& aCBk=aBSE.CommonBlock();
|
||||
//
|
||||
BOPDS_ShapeInfo aSI;
|
||||
aSI.SetShapeType(TopAbs_EDGE);
|
||||
aSI.SetShape(aSp);
|
||||
aSI.ChangeBox()=aBox;
|
||||
TColStd_ListOfInteger& aSubShapes = aSI.ChangeSubShapes();
|
||||
aSubShapes.Append(aPBk->Pave1().Index());
|
||||
aSubShapes.Append(aPBk->Pave2().Index());
|
||||
//
|
||||
nSp=myDS->Append(aSI);
|
||||
//
|
||||
if (!aCBk.IsNull()) {
|
||||
myDS->UpdateEdgeTolerance(nSp, aBSE.Tolerance());
|
||||
UpdateEdgeTolerance(nSp, aBSE.Tolerance());
|
||||
aCBk->SetEdge(nSp);
|
||||
}
|
||||
else {
|
||||
@@ -644,54 +645,53 @@ void BOPAlgo_PaveFiller::MakePCurves()
|
||||
continue;
|
||||
}
|
||||
//
|
||||
Handle(BOPDS_CommonBlock) aCB=myDS->CommonBlock(aPB);
|
||||
if (aCB.IsNull()) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
const BOPDS_ListOfPaveBlock& aLPB=aCB->PaveBlocks();
|
||||
if (aLPB.Extent()<2) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
BOPAlgo_MPC& aMPC=aVMPC.Appended();
|
||||
//
|
||||
aItLPB.Initialize(aLPB);
|
||||
for(; aItLPB.More(); aItLPB.Next()) {
|
||||
const Handle(BOPDS_PaveBlock)& aPBx=aItLPB.Value();
|
||||
if (aPBx==aPB) {
|
||||
continue;
|
||||
BOPAlgo_MPC& aMPC = aVMPC.Appended();
|
||||
|
||||
Handle(BOPDS_CommonBlock) aCB = myDS->CommonBlock(aPB);
|
||||
|
||||
if (!aCB.IsNull())
|
||||
{
|
||||
const BOPDS_ListOfPaveBlock& aLPB = aCB->PaveBlocks();
|
||||
if (aLPB.Extent() >= 2)
|
||||
{
|
||||
aItLPB.Initialize(aLPB);
|
||||
for(; aItLPB.More(); aItLPB.Next()) {
|
||||
const Handle(BOPDS_PaveBlock)& aPBx=aItLPB.Value();
|
||||
if (aPBx==aPB) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
nEx=aPBx->OriginalEdge();
|
||||
const TopoDS_Edge& aEx=(*(TopoDS_Edge *)(&myDS->Shape(nEx)));
|
||||
bHasPC=BOPTools_AlgoTools2D::HasCurveOnSurface (aEx, aF1F);
|
||||
if (!bHasPC) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
Standard_Integer nV1x, nV2x;
|
||||
Standard_Real aT1x, aT2x;
|
||||
TopoDS_Vertex aV1x, aV2x;
|
||||
TopoDS_Edge aEz;
|
||||
//
|
||||
aEz=aEx;
|
||||
aEz.Orientation(TopAbs_FORWARD);
|
||||
//
|
||||
aPBx->Indices(nV1x, nV2x);
|
||||
aPBx->Range(aT1x, aT2x);
|
||||
//
|
||||
aV1x=(*(TopoDS_Vertex *)(&myDS->Shape(nV1x)));
|
||||
aV1x.Orientation(TopAbs_FORWARD);
|
||||
//
|
||||
aV2x=(*(TopoDS_Vertex *)(&myDS->Shape(nV2x)));
|
||||
aV2x.Orientation(TopAbs_REVERSED);
|
||||
//
|
||||
aMPC.SetData(aEz, aV1x, aT1x, aV2x, aT2x);
|
||||
//
|
||||
break;
|
||||
}
|
||||
}
|
||||
//
|
||||
nEx=aPBx->OriginalEdge();
|
||||
const TopoDS_Edge& aEx=(*(TopoDS_Edge *)(&myDS->Shape(nEx)));
|
||||
bHasPC=BOPTools_AlgoTools2D::HasCurveOnSurface (aEx, aF1F);
|
||||
if (!bHasPC) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
Standard_Integer nV1x, nV2x;
|
||||
Standard_Real aT1x, aT2x;
|
||||
TopoDS_Vertex aV1x, aV2x;
|
||||
TopoDS_Edge aEz;
|
||||
//
|
||||
aEz=aEx;
|
||||
aEz.Orientation(TopAbs_FORWARD);
|
||||
//
|
||||
aPBx->Indices(nV1x, nV2x);
|
||||
aPBx->Range(aT1x, aT2x);
|
||||
//
|
||||
aV1x=(*(TopoDS_Vertex *)(&myDS->Shape(nV1x)));
|
||||
aV1x.Orientation(TopAbs_FORWARD);
|
||||
//
|
||||
aV2x=(*(TopoDS_Vertex *)(&myDS->Shape(nV2x)));
|
||||
aV2x.Orientation(TopAbs_REVERSED);
|
||||
//
|
||||
aMPC.SetData(aEz, aV1x, aT1x, aV2x, aT2x);
|
||||
//
|
||||
break;
|
||||
}
|
||||
//
|
||||
|
||||
aMPC.SetEdge(aE);
|
||||
aMPC.SetFace(aF1F);
|
||||
aMPC.SetProgressIndicator(myProgressIndicator);
|
||||
|
@@ -112,7 +112,8 @@ void BOPAlgo_Tools::FillMap(const Handle(BOPDS_PaveBlock)& aPB,
|
||||
//=======================================================================
|
||||
void BOPAlgo_Tools::PerformCommonBlocks(BOPDS_IndexedDataMapOfPaveBlockListOfPaveBlock& aMPBLPB,
|
||||
const Handle(NCollection_BaseAllocator)& aAllocator,
|
||||
BOPDS_PDS& pDS)
|
||||
BOPDS_PDS& pDS,
|
||||
const Handle(IntTools_Context)& theContext)
|
||||
{
|
||||
Standard_Integer aNbCB;
|
||||
//
|
||||
@@ -171,6 +172,10 @@ void BOPAlgo_Tools::PerformCommonBlocks(BOPDS_IndexedDataMapOfPaveBlockListOfPav
|
||||
aCB->SetFaces(aLFaces);
|
||||
for (aItLPB.Initialize(aLPB); aItLPB.More(); aItLPB.Next())
|
||||
pDS->SetCommonBlock(aItLPB.Value(), aCB);
|
||||
|
||||
// Compute tolerance for Common Block
|
||||
Standard_Real aTolCB = BOPAlgo_Tools::ComputeToleranceOfCB(aCB, pDS, theContext);
|
||||
aCB->SetTolerance(aTolCB);
|
||||
}
|
||||
}
|
||||
//=======================================================================
|
||||
@@ -179,7 +184,8 @@ void BOPAlgo_Tools::PerformCommonBlocks(BOPDS_IndexedDataMapOfPaveBlockListOfPav
|
||||
//=======================================================================
|
||||
void BOPAlgo_Tools::PerformCommonBlocks(const BOPDS_IndexedDataMapOfPaveBlockListOfInteger& aMPBLI,
|
||||
const Handle(NCollection_BaseAllocator)& ,//aAllocator
|
||||
BOPDS_PDS& pDS)
|
||||
BOPDS_PDS& pDS,
|
||||
const Handle(IntTools_Context)& theContext)
|
||||
{
|
||||
Standard_Integer nF, i, aNb;
|
||||
TColStd_ListIteratorOfListOfInteger aItLI;
|
||||
@@ -216,6 +222,9 @@ void BOPAlgo_Tools::PerformCommonBlocks(const BOPDS_IndexedDataMapOfPaveBlockLis
|
||||
}
|
||||
aCB->AppendFaces(aNewFaces);
|
||||
pDS->SetCommonBlock(aPB, aCB);
|
||||
// Compute tolerance for Common Block
|
||||
Standard_Real aTolCB = BOPAlgo_Tools::ComputeToleranceOfCB(aCB, pDS, theContext);
|
||||
aCB->SetTolerance(aTolCB);
|
||||
}
|
||||
}
|
||||
//=======================================================================
|
||||
@@ -253,6 +262,10 @@ Standard_Real BOPAlgo_Tools::ComputeToleranceOfCB
|
||||
aPBR->Range(aT1, aT2);
|
||||
aDt = (aT2 - aT1) / (aNbPnt + 1);
|
||||
//
|
||||
Handle(IntTools_Context) aCtx = theContext;
|
||||
if (aCtx.IsNull())
|
||||
aCtx = new IntTools_Context();
|
||||
|
||||
// compute max tolerance for common blocks on edges
|
||||
if (aLPB.Extent() > 1) {
|
||||
// compute max distance between edges
|
||||
@@ -270,7 +283,7 @@ Standard_Real BOPAlgo_Tools::ComputeToleranceOfCB
|
||||
const TopoDS_Edge& aE = *(TopoDS_Edge*)&theDS->Shape(nE);
|
||||
aTol = BRep_Tool::Tolerance(aE);
|
||||
//
|
||||
aProjPC = theContext->ProjPC(aE);
|
||||
aProjPC = aCtx->ProjPC(aE);
|
||||
//
|
||||
aT = aT1;
|
||||
for (Standard_Integer i=1; i <= aNbPnt; i++) {
|
||||
@@ -299,7 +312,7 @@ Standard_Real BOPAlgo_Tools::ComputeToleranceOfCB
|
||||
const TopoDS_Face& aF = *(TopoDS_Face*)&theDS->Shape(nF);
|
||||
aTol = BRep_Tool::Tolerance(aF);
|
||||
//
|
||||
aProjPS = theContext->ProjPS(aF);
|
||||
aProjPS = aCtx->ProjPS(aF);
|
||||
//
|
||||
aT = aT1;
|
||||
for (Standard_Integer i=1; i <= aNbPnt; i++) {
|
||||
|
@@ -99,14 +99,19 @@ public:
|
||||
const Standard_Integer theF,
|
||||
BOPDS_IndexedDataMapOfPaveBlockListOfInteger& theMILI,
|
||||
const Handle(NCollection_BaseAllocator)& theAllocator);
|
||||
|
||||
|
||||
//! Create Common Blocks from the groups of pave blocks of <theMBlocks>
|
||||
//! connection map.
|
||||
Standard_EXPORT static void PerformCommonBlocks(BOPDS_IndexedDataMapOfPaveBlockListOfPaveBlock& theMBlocks,
|
||||
const Handle(NCollection_BaseAllocator)& theAllocator,
|
||||
BOPDS_PDS& theDS);
|
||||
BOPDS_PDS& theDS,
|
||||
const Handle(IntTools_Context)& theContext = Handle(IntTools_Context)());
|
||||
|
||||
//! Create Common Blocks on faces using the PB->Faces connection map <theMBlocks>.
|
||||
Standard_EXPORT static void PerformCommonBlocks(const BOPDS_IndexedDataMapOfPaveBlockListOfInteger& theMBlocks,
|
||||
const Handle(NCollection_BaseAllocator)& theAllocator,
|
||||
BOPDS_PDS& pDS);
|
||||
BOPDS_PDS& pDS,
|
||||
const Handle(IntTools_Context)& theContext = Handle(IntTools_Context)());
|
||||
|
||||
Standard_EXPORT static Standard_Real ComputeToleranceOfCB
|
||||
(const Handle(BOPDS_CommonBlock)& theCB,
|
||||
|
Reference in New Issue
Block a user