+
+//=======================================================================
+//function : GlueFacesByList
+//purpose :
+//=======================================================================
+TopoDS_Shape GEOMImpl_GlueDriver::GlueFacesByList (const TopoDS_Shape& theShape,
+ const Standard_Real theTolerance,
+ const Standard_Boolean doKeepNonSolids,
+ const TopTools_MapOfShape& aFaces)
+{
+ TopoDS_Shape aRes;
+
+ GEOMAlgo_Gluer1 aGluer;
+ GEOMAlgo_ListIteratorOfListOfCoupleOfShapes aItCS;
+ GEOMAlgo_CoupleOfShapes aCS;
+ GEOMAlgo_ListOfCoupleOfShapes aLCS;
+
+ aGluer.SetShape(theShape);
+ aGluer.SetTolerance(theTolerance);
+ aGluer.SetKeepNonSolids(doKeepNonSolids);
+ aGluer.Perform();
+ Standard_Integer iErr = aGluer.ErrorStatus();
+ if (iErr) return aRes;
+
+ TopTools_ListOfShape listShape;
+ const GEOMAlgo_ListOfCoupleOfShapes& aLCSG = aGluer.GluedFaces();
+ // Access to faces
+ aItCS.Initialize(aLCSG);
+ for (; aItCS.More(); aItCS.Next()) {
+ const GEOMAlgo_CoupleOfShapes& aCSG = aItCS.Value();
+ const TopoDS_Shape& aF1 = aCSG.Shape1();
+ const TopoDS_Shape& aF2 = aCSG.Shape2();
+ if( aFaces.Contains(aF1) || aFaces.Contains(aF2) )
+ continue;
+ aCS.SetShapes(aF1,aF2);
+ aLCS.Append(aCS);
+ }
+
+ //cout<<"aLCS.Extent() = "<<aLCS.Extent()<<endl;
+ if(aLCS.Extent()>0) {
+ aGluer.SetFacesToUnglue(aLCS);
+ aGluer.UnglueFaces();
+ iErr = aGluer.ErrorStatus();
+ if (iErr) return aRes;
+ }
+
+ aRes = aGluer.Result();
+
+ return aRes;
+}
+
+