mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2025-01-27 10:30:35 +05:00
0022375: [CEA 973] UnionFaces shall not suppress an edge between 2 continuous faces if this edge is shared with a 3rd incident face
This commit is contained in:
parent
e30226dad2
commit
ffb97fe743
@ -189,6 +189,50 @@ static Handle(Geom_Surface) ClearRts(const Handle(Geom_Surface)& aSurface)
|
|||||||
return aSurface;
|
return aSurface;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : IsFacesOfSameSolids
|
||||||
|
//purpose : auxilary
|
||||||
|
//=======================================================================
|
||||||
|
static Standard_Boolean IsFacesOfSameSolids
|
||||||
|
(const TopoDS_Face &theFace1,
|
||||||
|
const TopoDS_Face &theFace2,
|
||||||
|
const TopTools_IndexedDataMapOfShapeListOfShape &theMapFaceSolids)
|
||||||
|
{
|
||||||
|
Standard_Boolean isSame = Standard_False;
|
||||||
|
|
||||||
|
if (theMapFaceSolids.Contains(theFace1) &&
|
||||||
|
theMapFaceSolids.Contains(theFace2)) {
|
||||||
|
const TopTools_ListOfShape& aList1 = theMapFaceSolids.FindFromKey(theFace1);
|
||||||
|
const TopTools_ListOfShape& aList2 = theMapFaceSolids.FindFromKey(theFace2);
|
||||||
|
|
||||||
|
if (aList1.Extent() == aList2.Extent()) {
|
||||||
|
TopTools_ListIteratorOfListOfShape anIter1(aList1);
|
||||||
|
|
||||||
|
isSame = Standard_True;
|
||||||
|
|
||||||
|
for (; anIter1.More(); anIter1.Next()) {
|
||||||
|
const TopoDS_Shape &aSolid1 = anIter1.Value();
|
||||||
|
TopTools_ListIteratorOfListOfShape anIter2(aList2);
|
||||||
|
|
||||||
|
for (; anIter2.More(); anIter2.Next()) {
|
||||||
|
if (aSolid1.IsSame(anIter2.Value())) {
|
||||||
|
// Same solid is detected. Break the loop
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!anIter2.More()) {
|
||||||
|
// No same solid is detected. Break the loop.
|
||||||
|
isSame = Standard_False;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return isSame;
|
||||||
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : Perform
|
//function : Perform
|
||||||
//purpose :
|
//purpose :
|
||||||
@ -198,6 +242,12 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape)
|
|||||||
Handle(ShapeBuild_ReShape) myContext = new ShapeBuild_ReShape;
|
Handle(ShapeBuild_ReShape) myContext = new ShapeBuild_ReShape;
|
||||||
TopoDS_Shape aResShape = myContext->Apply(Shape);
|
TopoDS_Shape aResShape = myContext->Apply(Shape);
|
||||||
|
|
||||||
|
// Fill Map of faces as keys and list of solids as items.
|
||||||
|
TopTools_IndexedDataMapOfShapeListOfShape aMapFaceSolids;
|
||||||
|
|
||||||
|
TopExp::MapShapesAndAncestors
|
||||||
|
(Shape, TopAbs_FACE, TopAbs_SOLID, aMapFaceSolids);
|
||||||
|
|
||||||
// processing each solid
|
// processing each solid
|
||||||
TopExp_Explorer exps;
|
TopExp_Explorer exps;
|
||||||
for (exps.Init(Shape, TopAbs_SOLID); exps.More(); exps.Next()) {
|
for (exps.Init(Shape, TopAbs_SOLID); exps.More(); exps.Next()) {
|
||||||
@ -265,6 +315,11 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape)
|
|||||||
if (aProcessed.Contains(anCheckedFace))
|
if (aProcessed.Contains(anCheckedFace))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// Check if faces belong to same solids.
|
||||||
|
if (!IsFacesOfSameSolids(aFace, anCheckedFace, aMapFaceSolids)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (IsSameDomain(aFace,anCheckedFace)) {
|
if (IsSameDomain(aFace,anCheckedFace)) {
|
||||||
|
|
||||||
if (aList.Extent() != 2) {
|
if (aList.Extent() != 2) {
|
||||||
|
Loading…
Reference in New Issue
Block a user