+ TopAbs_ShapeEnum aType;
+ //
+ aType=aS.ShapeType();
+ //
+ if (aType==TopAbs_SOLID) {
+ Standard_Boolean bHasImage, bHasInternalFaces;
+ Standard_Integer i, aNbSd;
+ TopTools_IndexedMapOfShape aMSo, aMSd;
+ TopoDS_Iterator aIt;
+ TopTools_IndexedDataMapOfShapeListOfShape aMFS;
+ TopTools_ListIteratorOfListOfShape aItLS;
+ //
+ bHasInternalFaces=myMapSIFC.IsBound(aS);
+ if (bHasInternalFaces){
+ TopExp::MapShapesAndAncestors(myShape, TopAbs_FACE, TopAbs_SOLID, aMFS);
+ //
+ const TopoDS_Shape& aIFC=myMapSIFC.Find(aS);
+ //
+ aIt.Initialize(aIFC);
+ for (; aIt.More(); aIt.Next()) {
+ const TopoDS_Shape& aIF=aIt.Value();
+ if (aMFS.Contains(aIF)) {
+ const TopTools_ListOfShape& aLS=aMFS.FindFromKey(aIF);
+ //
+ aItLS.Initialize(aLS);
+ for (; aItLS.More(); aItLS.Next()) {
+ const TopoDS_Shape& aSx=aItLS.Value();
+ aMSd.Add(aSx);
+ }
+ }
+ }
+ //
+ aNbSd=aMSd.Extent();
+ if (aNbSd) {
+ for (i=1; i<=aNbSd; ++i) {
+ const TopoDS_Shape& aSx=aMSd(i);
+ if (!aSx.IsSame(aS)) {
+ aLIms.Append(aSx);
+ }
+ }
+ return;
+ }
+ }
+ //
+ bHasImage=myImageShape.HasImage(aS);
+ if (!bHasImage) {
+ return;
+ }
+ //
+ TopoDS_Shape aSd;
+ //
+ TopExp::MapShapes(myShape, TopAbs_SOLID, aMSo);
+ //
+ const TopoDS_Shape& aFC=myImageShape.Image(aS).First();
+ bHasImage=NMTAlgo_Tools::FindImageSolid(aFC, aMSo, aSd);
+ if (bHasImage) {
+ if (!aSd.IsSame(aS)) {
+ aLIms.Append(aSd);
+ }
+ }
+ } //if (aType==TopAbs_SOLID) {
+ //==
+ else if (aType==TopAbs_FACE) {
+ TopTools_MapOfShape aMap;
+ TopTools_ListIteratorOfListOfShape aIt;
+ TopExp_Explorer anExp;
+ //
+ if (myModifiedFaces.IsBound(aS)) {
+ anExp.Init(myShape, aType);
+ for(; anExp.More(); anExp.Next()) {
+ aMap.Add(anExp.Current());
+ }
+ //
+ const TopTools_ListOfShape& aLS=myModifiedFaces.Find(aS);
+ aIt.Initialize(aLS);
+ for (; aIt.More(); aIt.Next()) {
+ const TopoDS_Shape& aFx=aIt.Value();
+ if (!aFx.IsSame(aS)) {
+ if (aMap.Contains(aFx)) {
+ aLIms.Append(aFx);
+ }
+ }
+ }
+ }
+ } // else if (aType==TopAbs_FACE)
+ //==
+ else if (aType==TopAbs_EDGE) {
+ TopTools_MapOfShape aMap;
+ TopTools_ListIteratorOfListOfShape aIt;
+ TopExp_Explorer anExp;
+ //
+ if (myImagesEdges.HasImage(aS)) {
+ anExp.Init(myShape, aType);
+ for(; anExp.More(); anExp.Next()) {
+ aMap.Add(anExp.Current());
+ }
+ //
+ const TopTools_ListOfShape& aLE=myImagesEdges.Image(aS);
+ aIt.Initialize(aLE);
+ for (; aIt.More(); aIt.Next()) {
+ const TopoDS_Shape& aEx=aIt.Value();
+ if (!aEx.IsSame(aS)) {
+ if(aMap.Contains(aEx)) {
+ aLIms.Append(aEx);
+ }
+ }
+ }
+ }
+ }// else if (aType==TopAbs_EDGE)
+ //==
+ else if (aType==TopAbs_VERTEX) {
+ Standard_Integer aNbS, anIndex, i, aSDVInd;
+ TopExp_Explorer anExp;
+ //
+ const NMTTools_DSFiller& aDSF = Filler();
+ const NMTTools_PaveFiller& aPF = aDSF.PaveFiller();
+ const NMTDS_ShapesDataStructure& aDS = aDSF.DS();
+ //
+ aNbS = aDS.NumberOfSourceShapes();
+ anIndex = 0;
+ //
+ for(i=1; i<=aNbS; ++i) {
+ const TopoDS_Shape& aSx = aDS.Shape(i);
+ if(aS.IsSame(aSx)) {
+ anIndex = i;
+ break;
+ }
+ }
+ //
+ if(!anIndex) {
+ return;
+ }
+ //
+ aSDVInd=aPF.FindSDVertex(anIndex);
+ if(!aSDVInd) {
+ return;
+ }
+ //
+ const TopoDS_Shape& aSDV=aDS.Shape(aSDVInd);
+ //