//======================================================================= //function : EdgePassKey //purpose : //======================================================================= void GEOMAlgo_GlueDetector::EdgePassKey(const TopoDS_Edge& aE, GEOMAlgo_PassKeyShape& aPK) { TopAbs_Orientation aOr; TopoDS_Shape aVR; TopoDS_Iterator aIt; TopTools_ListOfShape aLV; // aIt.Initialize(aE); for (; aIt.More(); aIt.Next()) { const TopoDS_Shape& aV=aIt.Value(); aOr=aV.Orientation(); if (aOr==TopAbs_FORWARD || aOr==TopAbs_REVERSED) { if (myOrigins.IsBound(aV)) { aVR=myOrigins.Find(aV); } else { aVR=aV; } aLV.Append(aVR); } } // aPK.SetShapes(aLV); }
//======================================================================= //function : FacePassKey //purpose : //======================================================================= void GEOMAlgo_GlueDetector::FacePassKey(const TopoDS_Face& aF, GEOMAlgo_PassKeyShape& aPK) { Standard_Integer i, aNbE; TopoDS_Shape aER; TopTools_ListOfShape aLE; TopTools_IndexedMapOfShape aME; // TopExp::MapShapes(aF, TopAbs_EDGE, aME); // aNbE=aME.Extent(); for (i=1; i<=aNbE; ++i) { const TopoDS_Shape& aE=aME(i); // const TopoDS_Edge& aEE=*((TopoDS_Edge*)&aE); if (BRep_Tool::Degenerated(aEE)) { continue; } // if (myOrigins.IsBound(aE)) { aER=myOrigins.Find(aE); } else { aER=aE; } aLE.Append(aER); } aPK.SetShapes(aLE); }
//======================================================================= //function : DetectSolids //purpose : //======================================================================= void GEOMAlgo_GlueAnalyser::DetectSolids() { myErrorStatus=0; // Standard_Integer i, aNbF, aNbS, aNbC, aNbX; TopoDS_Compound aCmp; BRep_Builder aBB; TopTools_IndexedDataMapOfShapeListOfShape aMFS; TopTools_IndexedMapOfShape aMx, aMS; TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItIm; GEOMAlgo_CoupleOfShapes aCS; // GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape aMPKLS; GEOMAlgo_PassKeyShape aPKSx; // aBB.MakeCompound(aCmp); // TopExp::MapShapesAndAncestors(myShape, TopAbs_FACE, TopAbs_SOLID, aMFS); // aItIm.Initialize(myImages); for (; aItIm.More(); aItIm.Next()) { const TopoDS_Shape& aIm=aItIm.Key(); if (aIm.ShapeType()!=TopAbs_FACE) { continue; } // const TopTools_ListOfShape& aLF=aItIm.Value(); aNbF=aLF.Extent(); if (aNbF!=2) { continue; } // TopoDS_Shape aSx[2], aFx[2]; // aFx[0]=aLF.First(); aFx[1]=aLF.Last(); for (i=0; i<2; ++i) { if (!aMFS.Contains(aFx[i])) { continue;// it must not be so } // const TopTools_ListOfShape& aLS=aMFS.FindFromKey(aFx[i]); aNbS=aLS.Extent(); if (aNbS!=1) { continue; } aSx[i]=aLS.First(); } // if (aSx[0].IsNull() || aSx[1].IsNull()) { continue; } // //aPKSx.Clear();//qft //qf //aPKSx.SetIds(aSx[0], aSx[1]); aPKSx.SetShapes(aSx[0], aSx[1]); //qt // if (!aMPKLS.Contains(aPKSx)) { TopTools_ListOfShape aLSx; // aLSx.Append(aSx[0]); aLSx.Append(aSx[1]); // aMPKLS.Add(aPKSx, aLSx); } } // mySolidsToGlue.Clear(); mySolidsAlone.Clear(); // aNbC=aMPKLS.Extent(); if (!aNbC) { return; } // for (i=1; i<=aNbC; ++i) { const TopTools_ListOfShape& aLSx=aMPKLS(i); const TopoDS_Shape& aSx1=aLSx.First(); const TopoDS_Shape& aSx2=aLSx.Last(); aCS.SetShape1(aSx1); aCS.SetShape2(aSx2); mySolidsToGlue.Append(aCS); // if (!aMx.Contains(aSx1)) { aBB.Add(aCmp, aSx1); aMx.Add(aSx1); } if (!aMx.Contains(aSx2)) { aBB.Add(aCmp, aSx2); aMx.Add(aSx2); } } myResult=aCmp; // // check alone solids TopExp::MapShapes(myShape, TopAbs_SOLID, aMS); // aNbX=aMx.Extent(); for (i=1; i<=aNbX; ++i) { const TopoDS_Shape& aSx=aMx(i); if (!aMS.Contains(aSx)) { mySolidsAlone.Append(aSx); } } }