X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMAlgo_NEW%2FGEOMAlgo_GlueDetector.cxx;h=fb8d5dfdcb91bf504428b7cc88fc5f142131c77d;hb=2e342cb5f38238bd273ed03eabd723f9f6913196;hp=e0471cfe32e0884e7ab7d533b4b654d2e8f243b7;hpb=35bb93a206728fca2a4053e19711b494393204df;p=modules%2Fgeom.git diff --git a/src/GEOMAlgo_NEW/GEOMAlgo_GlueDetector.cxx b/src/GEOMAlgo_NEW/GEOMAlgo_GlueDetector.cxx index e0471cfe3..fb8d5dfdc 100644 --- a/src/GEOMAlgo_NEW/GEOMAlgo_GlueDetector.cxx +++ b/src/GEOMAlgo_NEW/GEOMAlgo_GlueDetector.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -19,11 +19,10 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // File: GEOMAlgo_GlueDetector.cxx -// Created: // Author: Peter KURNEV -// -// + #include #include @@ -61,10 +60,25 @@ #include #include #include +// +#include +#include +#include +#include + +//modified by NIZNHY-PKV Tue Mar 13 10:25:47 2012f +static + Standard_Integer CheckAncesstors + (const TopoDS_Shape& aVSD, + const TopTools_MapOfShape& aMVSD, + const TopTools_IndexedDataMapOfShapeListOfShape& aMVE, + const TopTools_IndexedDataMapOfShapeListOfShape& aMEV, + TopTools_IndexedDataMapOfShapeListOfShape& aMEVZ); +//modified by NIZNHY-PKV Tue Mar 13 10:25:50 2012t //======================================================================= -//function : -//purpose : +//function : +//purpose : //======================================================================= GEOMAlgo_GlueDetector::GEOMAlgo_GlueDetector() : @@ -73,18 +87,30 @@ GEOMAlgo_GlueDetector::GEOMAlgo_GlueDetector() {} //======================================================================= //function : ~ -//purpose : +//purpose : //======================================================================= GEOMAlgo_GlueDetector::~GEOMAlgo_GlueDetector() {} +//modified by NIZNHY-PKV Tue Mar 13 12:26:50 2012f +//======================================================================= +//function : StickedShapes +//purpose : +//======================================================================= +const TopTools_IndexedDataMapOfShapeListOfShape& + GEOMAlgo_GlueDetector::StickedShapes() +{ + return myStickedShapes; +} +//modified by NIZNHY-PKV Tue Mar 13 12:26:54 2012t //======================================================================= //function : Perform -//purpose : +//purpose : //======================================================================= void GEOMAlgo_GlueDetector::Perform() { myErrorStatus=0; myWarningStatus=0; + myStickedShapes.Clear(); // CheckData(); if (myErrorStatus) { @@ -99,6 +125,13 @@ void GEOMAlgo_GlueDetector::Perform() return; } // + //modified by NIZNHY-PKV Wed Mar 14 08:00:09 2012f + CheckDetected(); + if (myErrorStatus) { + return; + } + //modified by NIZNHY-PKV Wed Mar 14 08:00:12 2012t + // DetectEdges(); if (myErrorStatus) { return; @@ -111,7 +144,7 @@ void GEOMAlgo_GlueDetector::Perform() } //======================================================================= //function : DetectVertices -//purpose : +//purpose : //======================================================================= void GEOMAlgo_GlueDetector::DetectVertices() { @@ -127,7 +160,6 @@ void GEOMAlgo_GlueDetector::DetectVertices() TopTools_DataMapOfShapeListOfShape aMVV; GEOMAlgo_IndexedDataMapOfIntegerShape aMIS; NMTDS_IndexedDataMapOfShapeBndSphere aMSB; - // NMTDS_BndSphereTreeSelector aSelector; NMTDS_BndSphereTree aBBTree; NCollection_UBTreeFiller aTreeFiller(aBBTree); @@ -155,7 +187,7 @@ void GEOMAlgo_GlueDetector::DetectVertices() aTreeFiller.Add(i, aBox); // aMIS.Add(i, aV); - aMSB.Add(aV, aBox); + aMSB.Add(aV, aBox); } // aTreeFiller.Fill(); @@ -179,49 +211,49 @@ void GEOMAlgo_GlueDetector::DetectVertices() aNbIP=aMIP.Extent(); aIt1.Initialize(aMIP); for(; aIt1.More(); aIt1.Next()) { - aIP=aIt1.Key(); - if (aMIPC.Contains(aIP)) { - continue; - } - // - const TopoDS_Shape& aVP=aMIS.FindFromKey(aIP); - const NMTDS_BndSphere& aBoxVP=aMSB.FindFromKey(aVP); - // - aSelector.Clear(); - aSelector.SetBox(aBoxVP); - // - aNbVSD=aBBTree.Select(aSelector); - if (!aNbVSD) { - continue; // it shoild not be so [at least IP itself] - } - // - const TColStd_ListOfInteger& aLI=aSelector.Indices(); - aIt.Initialize(aLI); - for (; aIt.More(); aIt.Next()) { - aIP1=aIt.Value(); - if (aMIP.Contains(aIP1)) { - continue; - } - aMIP1.Add(aIP1); - } //for (; aIt.More(); aIt.Next()) { + aIP=aIt1.Key(); + if (aMIPC.Contains(aIP)) { + continue; + } + // + const TopoDS_Shape& aVP=aMIS.FindFromKey(aIP); + const NMTDS_BndSphere& aBoxVP=aMSB.FindFromKey(aVP); + // + aSelector.Clear(); + aSelector.SetBox(aBoxVP); + // + aNbVSD=aBBTree.Select(aSelector); + if (!aNbVSD) { + continue; // it shoild not be so [at least IP itself] + } + // + const TColStd_ListOfInteger& aLI=aSelector.Indices(); + aIt.Initialize(aLI); + for (; aIt.More(); aIt.Next()) { + aIP1=aIt.Value(); + if (aMIP.Contains(aIP1)) { + continue; + } + aMIP1.Add(aIP1); + } //for (; aIt.More(); aIt.Next()) { }//for(; aIt1.More(); aIt1.Next()) { // aNbIP1=aMIP1.Extent(); if (!aNbIP1) { - break; + break; } // aIt1.Initialize(aMIP); for(; aIt1.More(); aIt1.Next()) { - aIP=aIt1.Key(); - aMIPC.Add(aIP); + aIP=aIt1.Key(); + aMIPC.Add(aIP); } // aMIP.Clear(); aIt1.Initialize(aMIP1); for(; aIt1.More(); aIt1.Next()) { - aIP=aIt1.Key(); - aMIP.Add(aIP); + aIP=aIt1.Key(); + aMIP.Add(aIP); } aMIP1.Clear(); }// while(1) @@ -239,7 +271,7 @@ void GEOMAlgo_GlueDetector::DetectVertices() aIP=aIt1.Key(); const TopoDS_Shape& aVP=aMIS.FindFromKey(aIP); if (!j) { - aVF=aVP; + aVF=aVP; } aLVSD.Append(aVP); aMVProcessed.Add(aVP); @@ -257,14 +289,14 @@ void GEOMAlgo_GlueDetector::DetectVertices() for (; aItS.More(); aItS.Next()) { const TopoDS_Shape& aVSD=aItS.Value(); if (!myOrigins.IsBound(aVSD)) { - myOrigins.Bind(aVSD, aV); + myOrigins.Bind(aVSD, aV); } } } } //======================================================================= //function : DetectFaces -//purpose : +//purpose : //======================================================================= void GEOMAlgo_GlueDetector::DetectFaces() { @@ -272,7 +304,7 @@ void GEOMAlgo_GlueDetector::DetectFaces() } //======================================================================= //function : DetectEdges -//purpose : +//purpose : //======================================================================= void GEOMAlgo_GlueDetector::DetectEdges() { @@ -280,7 +312,7 @@ void GEOMAlgo_GlueDetector::DetectEdges() } //======================================================================= //function : DetectShapes -//purpose : +//purpose : //======================================================================= void GEOMAlgo_GlueDetector::DetectShapes(const TopAbs_ShapeEnum aType) { @@ -298,7 +330,7 @@ void GEOMAlgo_GlueDetector::DetectShapes(const TopAbs_ShapeEnum aType) aNbF=aMF.Extent(); for (i=1; i<=aNbF; ++i) { const TopoDS_Shape& aS=aMF(i); - // + // if (aType==TopAbs_FACE) { const TopoDS_Face& aF=*((TopoDS_Face*)&aS); FacePassKey(aF, aPKF); @@ -345,17 +377,18 @@ void GEOMAlgo_GlueDetector::DetectShapes(const TopAbs_ShapeEnum aType) continue; } // - const TopoDS_Shape& aS1=aLSDF.First(); + const TopoDS_Shape& aS1=aLSDF.First(); // if (aType==TopAbs_EDGE) { const TopoDS_Edge& aE1=*((TopoDS_Edge*)&aS1); bDegenerated=BRep_Tool::Degenerated(aE1); if (bDegenerated) { - continue; + continue; } } // myImages.Bind(aS1, aLSDF); + // // origins aItLS.Initialize(aLSDF); for (; aItLS.More(); aItLS.Next()) { @@ -368,10 +401,10 @@ void GEOMAlgo_GlueDetector::DetectShapes(const TopAbs_ShapeEnum aType) } //======================================================================= //function : FacePassKey -//purpose : +//purpose : //======================================================================= -void GEOMAlgo_GlueDetector::FacePassKey(const TopoDS_Face& aF, - GEOMAlgo_PassKeyShape& aPK) +void GEOMAlgo_GlueDetector::FacePassKey(const TopoDS_Face& aF, + GEOMAlgo_PassKeyShape& aPK) { Standard_Integer i, aNbE; TopoDS_Shape aER; @@ -388,7 +421,7 @@ void GEOMAlgo_GlueDetector::FacePassKey(const TopoDS_Face& aF, if (BRep_Tool::Degenerated(aEE)) { continue; } - // + // if (myOrigins.IsBound(aE)) { aER=myOrigins.Find(aE); } @@ -401,10 +434,10 @@ void GEOMAlgo_GlueDetector::FacePassKey(const TopoDS_Face& aF, } //======================================================================= //function : EdgePassKey -//purpose : +//purpose : //======================================================================= -void GEOMAlgo_GlueDetector::EdgePassKey(const TopoDS_Edge& aE, - GEOMAlgo_PassKeyShape& aPK) +void GEOMAlgo_GlueDetector::EdgePassKey(const TopoDS_Edge& aE, + GEOMAlgo_PassKeyShape& aPK) { TopAbs_Orientation aOr; TopoDS_Shape aVR; @@ -417,10 +450,10 @@ void GEOMAlgo_GlueDetector::EdgePassKey(const TopoDS_Edge& aE, aOr=aV.Orientation(); if (aOr==TopAbs_FORWARD || aOr==TopAbs_REVERSED) { if (myOrigins.IsBound(aV)) { - aVR=myOrigins.Find(aV); + aVR=myOrigins.Find(aV); } else { - aVR=aV; + aVR=aV; } aLV.Append(aVR); } @@ -428,3 +461,152 @@ void GEOMAlgo_GlueDetector::EdgePassKey(const TopoDS_Edge& aE, // aPK.SetShapes(aLV); } +//modified by NIZNHY-PKV Tue Mar 13 09:54:18 2012f +//======================================================================= +//function : CheckDetected +//purpose : +//======================================================================= +void GEOMAlgo_GlueDetector::CheckDetected() +{ + TopoDS_Iterator aItA; + TopExp_Explorer aExp; + TopTools_ListOfShape aLV; + TopTools_MapOfShape aMFence; + TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItIm; + TopTools_IndexedDataMapOfShapeListOfShape aMVE, aMEV; + // + // 1. aMVE, aMEV + TopExp::MapShapesAndAncestors(myArgument, TopAbs_VERTEX, TopAbs_EDGE, aMVE); + // + aExp.Init(myArgument, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + const TopoDS_Shape& aE=aExp.Current(); + // + aLV.Clear(); + aMFence.Clear(); + aItA.Initialize(aE); + for (; aItA.More(); aItA.Next()) { + const TopoDS_Shape& aV=aItA.Value(); + if (aMFence.Add(aV)) { + aLV.Append(aV); + } + } + // + aMEV.Add(aE, aLV); + } + // 2. Checking + aItIm.Initialize(myImages); + for (; aItIm.More(); aItIm.Next()) { + //const TopoDS_Shape& aV=aItIm.Key(); + const TopTools_ListOfShape& aLVSD=aItIm.Value(); + CheckDetected(aLVSD, aMVE, aMEV); + } +} +//======================================================================= +//function : CheckDetected +//purpose : +//======================================================================= +void GEOMAlgo_GlueDetector::CheckDetected + (const TopTools_ListOfShape& aLVSD, + const TopTools_IndexedDataMapOfShapeListOfShape& aMVE, + const TopTools_IndexedDataMapOfShapeListOfShape& aMEV) +{ + Standard_Integer i, aNbVSD, aNbA, iRet; + TopAbs_ShapeEnum aTypeS, aTypeA[2]; + TopExp_Explorer aExp, aExpA; + TopTools_MapOfShape aMFence, aMVSD; + TopTools_ListOfShape aLV; + TopTools_ListIteratorOfListOfShape aItLS; + // + myErrorStatus=0; + // + aNbVSD=aLVSD.Extent(); + if (aNbVSD < 2) { + return ; + } + // + aItLS.Initialize(aLVSD); + for (; aItLS.More(); aItLS.Next()) { + const TopoDS_Shape& aVSD=aItLS.Value(); + aMVSD.Add(aVSD); + } + // + aItLS.Initialize(aLVSD); + for (; aItLS.More(); aItLS.Next()) { + const TopoDS_Shape& aVSD=aItLS.Value(); + // + iRet=CheckAncesstors(aVSD, aMVSD, aMVE, aMEV, myStickedShapes); + if (iRet) { + // Sticked shapes detected + myWarningStatus=2; + } + } +} +//======================================================================= +//function : CheckAncesstors +//purpose : +//======================================================================= +Standard_Integer CheckAncesstors + (const TopoDS_Shape& aVSD, + const TopTools_MapOfShape& aMVSD, + const TopTools_IndexedDataMapOfShapeListOfShape& aMVE, + const TopTools_IndexedDataMapOfShapeListOfShape& aMEV, + TopTools_IndexedDataMapOfShapeListOfShape& aMEVZ) +{ + Standard_Address pLE, pLV, pLVZ; + Standard_Integer iRet, aNbVX; + TopTools_ListIteratorOfListOfShape aItLE, aItLV; + TopTools_MapOfShape aMFence; + TopTools_ListOfShape aLVX; + // + iRet=0; + // + pLE=aMVE.FindFromKey1(aVSD); + if (!pLE) { + return iRet; + } + // + const TopTools_ListOfShape& aLE=*((TopTools_ListOfShape*)pLE); + aItLE.Initialize(aLE); + for (; aItLE.More(); aItLE.Next()) { + const TopoDS_Shape& aE=aItLE.Value(); + // + pLV=aMEV.FindFromKey1(aE); + if (!pLV) { + continue; // it should be not so + } + // + aLVX.Clear(); + const TopTools_ListOfShape& aLV=*((TopTools_ListOfShape*)pLV); + aItLV.Initialize(aLV); + for (; aItLV.More(); aItLV.Next()) { + const TopoDS_Shape& aV=aItLV.Value(); + if (!aV.IsSame(aVSD)) { + if (aMVSD.Contains(aV)) { + if (aMFence.Add(aV)) { + aLVX.Append(aV); + } + } + } + } + // + aNbVX=aLVX.Extent(); + if (!aNbVX) { + continue; + } + // + iRet=1; + // + pLVZ=aMEVZ.FindFromKey1(aE); + if (!pLVZ) { + aMEVZ.Add(aE, aLVX); + } + else { + TopTools_ListOfShape& aLVZ=*((TopTools_ListOfShape*)pLVZ); + aLVZ.Append(aLVX); + } + } + // + return iRet; +} +//modified by NIZNHY-PKV Tue Mar 13 09:54:59 2012t