[bos #33687] EDF 26791 - Points cloud on face

This commit is contained in:
jfa 2023-04-04 14:51:11 +01:00
parent c586fe244b
commit 5a3993c7b0

View File

@ -1178,8 +1178,11 @@ Standard_Integer GEOMAlgo_AlgoTools::PointCloudInFace(const TopoDS_Face& theFace
aBB.Add (aGlobalRes, res); aBB.Add (aGlobalRes, res);
int iface = 1;
aBB.MakeCompound (theCompound); aBB.MakeCompound (theCompound);
for (TopExp_Explorer aGlobalExplo(aGlobalRes, TopAbs_FACE); aGlobalExplo.More(); aGlobalExplo.Next()) for (TopExp_Explorer aGlobalExplo (aGlobalRes, TopAbs_FACE);
aGlobalExplo.More(), iface <= theNbPnts;
aGlobalExplo.Next(), iface++)
{ {
const TopoDS_Face& aFace = TopoDS::Face (aGlobalExplo.Current()); const TopoDS_Face& aFace = TopoDS::Face (aGlobalExplo.Current());
Standard_Boolean anIsNaturalRestrictions = Standard_True; Standard_Boolean anIsNaturalRestrictions = Standard_True;
@ -1283,9 +1286,11 @@ gp_Pnt GetMidPnt2d(const TopoDS_Face& theFace,
BRepTools_WireExplorer aWexp (aWire, theFace); BRepTools_WireExplorer aWexp (aWire, theFace);
Standard_Integer anInd = 0; Standard_Integer anInd = 0;
TopTools_MapOfShape aUsedEmap;
for (; aWexp.More(); aWexp.Next()) for (; aWexp.More(); aWexp.Next())
{ {
const TopoDS_Edge& anEdge = aWexp.Current(); const TopoDS_Edge& anEdge = aWexp.Current();
if (!aUsedEmap.Add(anEdge)) continue;
BRepAdaptor_Curve2d aBAcurve2d (anEdge, theFace); BRepAdaptor_Curve2d aBAcurve2d (anEdge, theFace);
Standard_Real aDelta = (aBAcurve2d.LastParameter() - aBAcurve2d.FirstParameter())/aNbSamples; Standard_Real aDelta = (aBAcurve2d.LastParameter() - aBAcurve2d.FirstParameter())/aNbSamples;
for (Standard_Integer ii = 0; ii < aNbSamples; ii++) for (Standard_Integer ii = 0; ii < aNbSamples; ii++)
@ -1353,6 +1358,9 @@ void ModifyFacesForGlobalResult(const TopoDS_Face& theInputFace,
TopoDS_Shape& theGlobalRes, TopoDS_Shape& theGlobalRes,
TopTools_MapOfShape& theRemovedFaces) TopTools_MapOfShape& theRemovedFaces)
{ {
BRepAdaptor_Surface aBAsurf (theInputFace, Standard_False);
GeomAbs_SurfaceType aType = aBAsurf.GetType();
BRep_Builder aBB; BRep_Builder aBB;
const Standard_Integer aNbFaces = (Standard_Integer) theFacesAndAreas.size(); const Standard_Integer aNbFaces = (Standard_Integer) theFacesAndAreas.size();
@ -1456,6 +1464,19 @@ void ModifyFacesForGlobalResult(const TopoDS_Face& theInputFace,
if (aFace.IsSame (aStartFace)) if (aFace.IsSame (aStartFace))
{ {
anIsRound = Standard_True; anIsRound = Standard_True;
if (aType > GeomAbs_Torus) { // non-elementary surfaces
// remove last face to prevent close tape creation
// it is a workaround for Tulip bos #26791
// as there is a problem with closed tape on some surface types
aBB.Remove (aShell, aCurrentFace);
aNbFacesInTape--;
anAreaOfTape -= theFaceAreaMap(aCurrentFace);
aBB.Add(theRes, aCurrentFace); // aaajfa ???
theRemovedFaces.Remove(aCurrentFace);
if (theExtremalFaces.Contains(aCurrentFace)) {
aNbFacesDone--;
}
}
break; break;
} }
if (theRemovedFaces.Contains(aFace)) if (theRemovedFaces.Contains(aFace))
@ -1511,7 +1532,9 @@ void ModifyFacesForGlobalResult(const TopoDS_Face& theInputFace,
if (aNewNumberToSplit < aNbFacesInTape) if (aNewNumberToSplit < aNbFacesInTape)
{ {
Standard_Integer aNumberToIncrease = aNewNumberToSplit - aNumberToSplit; Standard_Integer aNumberToIncrease = aNewNumberToSplit - aNumberToSplit;
for (Standard_Integer jj = theNbExtremalFaces; jj < theNbExtremalFaces + aNumberToIncrease; jj++) for (Standard_Integer jj = theNbExtremalFaces;
jj < theNbExtremalFaces + aNumberToIncrease && jj < aNbFaces;
jj++)
theExtremalFaces.Add (theFacesAndAreas[jj].first); theExtremalFaces.Add (theFacesAndAreas[jj].first);
theNbExtremalFaces += aNumberToIncrease; theNbExtremalFaces += aNumberToIncrease;
aNumberToSplit = aNewNumberToSplit; aNumberToSplit = aNewNumberToSplit;
@ -1521,7 +1544,9 @@ void ModifyFacesForGlobalResult(const TopoDS_Face& theInputFace,
if (anIsRound && aNumberToSplit <= 1) if (anIsRound && aNumberToSplit <= 1)
{ {
Standard_Integer aNumberToIncrease = 3 - aNumberToSplit; Standard_Integer aNumberToIncrease = 3 - aNumberToSplit;
for (Standard_Integer jj = theNbExtremalFaces; jj < theNbExtremalFaces + aNumberToIncrease; jj++) for (Standard_Integer jj = theNbExtremalFaces;
jj < theNbExtremalFaces + aNumberToIncrease && jj < aNbFaces;
jj++)
theExtremalFaces.Add (theFacesAndAreas[jj].first); theExtremalFaces.Add (theFacesAndAreas[jj].first);
theNbExtremalFaces += aNumberToIncrease; theNbExtremalFaces += aNumberToIncrease;
aNumberToSplit = 3; aNumberToSplit = 3;
@ -1556,8 +1581,10 @@ void ModifyFacesForGlobalResult(const TopoDS_Face& theInputFace,
aNbFacesInLocalResult = 1; aNbFacesInLocalResult = 1;
if (aNumberToSplit == 0) if (aNumberToSplit == 0)
{ {
theExtremalFaces.Add (theFacesAndAreas[theNbExtremalFaces].first); if (theNbExtremalFaces < aNbFaces) {
theNbExtremalFaces++; theExtremalFaces.Add (theFacesAndAreas[theNbExtremalFaces].first);
theNbExtremalFaces++;
}
} }
} }
aBB.Add (theGlobalRes, aLocalResult); aBB.Add (theGlobalRes, aLocalResult);