aBB.Add (aGlobalRes, res);
+ int iface = 1;
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());
Standard_Boolean anIsNaturalRestrictions = Standard_True;
BRepTools_WireExplorer aWexp (aWire, theFace);
Standard_Integer anInd = 0;
+ TopTools_MapOfShape aUsedEmap;
for (; aWexp.More(); aWexp.Next())
{
const TopoDS_Edge& anEdge = aWexp.Current();
+ if (!aUsedEmap.Add(anEdge)) continue;
BRepAdaptor_Curve2d aBAcurve2d (anEdge, theFace);
Standard_Real aDelta = (aBAcurve2d.LastParameter() - aBAcurve2d.FirstParameter())/aNbSamples;
for (Standard_Integer ii = 0; ii < aNbSamples; ii++)
TopoDS_Shape& theGlobalRes,
TopTools_MapOfShape& theRemovedFaces)
{
+ BRepAdaptor_Surface aBAsurf (theInputFace, Standard_False);
+ GeomAbs_SurfaceType aType = aBAsurf.GetType();
+
BRep_Builder aBB;
const Standard_Integer aNbFaces = (Standard_Integer) theFacesAndAreas.size();
{
Standard_Integer aNbFacesDone = 0, aNbFacesInTape = 0;
TopoDS_Face aStartFace;
-
+
Standard_Integer aStartIndex = (theIsToAddFaces)? aNbFaces-1 : 0;
Standard_Integer anEndIndex = (theIsToAddFaces)? 0 : aNbFaces-1;
Standard_Integer aStep = (theIsToAddFaces)? -1 : 1;
-
+
for (Standard_Integer ii = aStartIndex; ii != anEndIndex; ii += aStep)
{
const TopoDS_Face& aFace = TopoDS::Face (theFacesAndAreas[ii].first);
break;
theRemovedFaces.Add (aStartFace);
-
+
TopoDS_Edge aCommonEdge;
TopoDS_Face aNextFace;
Standard_Real anExtremalArea = (theIsToAddFaces)? 0. : Precision::Infinite();
if (aFace.IsSame (aStartFace))
{
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;
}
if (theRemovedFaces.Contains(aFace))
if (aNewNumberToSplit < aNbFacesInTape)
{
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);
theNbExtremalFaces += aNumberToIncrease;
aNumberToSplit = aNewNumberToSplit;
if (anIsRound && aNumberToSplit <= 1)
{
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);
theNbExtremalFaces += aNumberToIncrease;
aNumberToSplit = 3;
aNbFacesInLocalResult = 1;
if (aNumberToSplit == 0)
{
- theExtremalFaces.Add (theFacesAndAreas[theNbExtremalFaces].first);
- theNbExtremalFaces++;
+ if (theNbExtremalFaces < aNbFaces) {
+ theExtremalFaces.Add (theFacesAndAreas[theNbExtremalFaces].first);
+ theNbExtremalFaces++;
+ }
}
}
aBB.Add (theGlobalRes, aLocalResult);
if (aMaxNbFaces == 1)
break;
-
+
aBB.Remove (theGlobalRes, aMaxShell);
//Find iso
Standard_Boolean anIsUiso = Standard_True;