Salome HOME
Merge commit '0d956a814' into pre/IMPS_2016
[modules/hydro.git] / src / HYDROData / HYDROData_SplitToZonesTool.cxx
index 2836229ae258c99d95418898cae18777c6edae4e..8784a1e5f31f9a008241221c5e86ac2e7e652b30 100644 (file)
@@ -44,6 +44,7 @@
 #include <BOPAlgo_BOP.hxx>
 #include <BOPAlgo_Builder.hxx>
 #include <TopExp.hxx>
+#include <assert.h>
 
 //#define DEB_SPLIT_TO_ZONES 1
 //#define DEB_SPLIT_TO_ZONES_CHECK_PARTITION 1
@@ -227,7 +228,8 @@ HYDROData_SplitToZonesTool::SplitDataList
       //anOutputSplitDataList.append(anInputSplitDataList); 
       SplitData SD = anInputSplitDataList.at(0);
       TopTools_ListOfShape newshs;
-      CutFaceByEdges(SD.Face(), newshs, InterPolys, &OutNE);
+      TopTools_IndexedDataMapOfShapeListOfShape OutOrSh2M;
+      CutFaceByEdges(SD.Face(), newshs, InterPolys, &OutNE, &OutOrSh2M);
       for (TopTools_ListIteratorOfListOfShape it(newshs); it.More(); it.Next())
       {
         SplitData NSD = SD;
@@ -245,8 +247,66 @@ HYDROData_SplitToZonesTool::SplitDataList
         anOutputSplitDataList.append(SDI);
       }
 
+#ifndef NDEBUG
+      //check CutFaceByEdges method: ensure that SD.Face() edges fully covered by
+      //history map (OutOrSh2M)
+      if (!OutOrSh2M.IsEmpty())
+      {
+        TopTools_IndexedMapOfShape EE;
+        TopExp::MapShapes(SD.Face(), TopAbs_EDGE, EE);
+        int noncontNb = 0;      
+        for (int i = 1; i <= EE.Extent(); i++)
+        {
+          const TopoDS_Shape& E = EE(i);
+          noncontNb += !OutOrSh2M.Contains(E);
+        }
+        //noncontNb > 0 => some problem with edge history
+        assert(noncontNb == 0);
+      }
+#endif
+
       if(!theGroupsList.IsEmpty() ) 
-        anOutputSplitDataList.append(anInputGroupList);
+      {
+        SplitDataList ModifInpGroupList;
+        SplitDataListIterator it(anInputGroupList);
+        while( it.hasNext() )
+        {
+          const SplitData& SData = it.next();
+          if (SData.Type != SplitData::Data_Edge)
+            ModifInpGroupList.append(SData); //add as is
+          const TopoDS_Shape& SData_sh = SData.Shape;
+          TopTools_ListOfShape modif_ls;
+          if (!InterPolys.IsEmpty())
+            if (OutOrSh2M.Contains(SData_sh))
+              modif_ls = OutOrSh2M.FindFromKey(SData_sh);
+            //else TODO -  show message that one of the object should be updated
+
+#ifndef NDEBUG
+          if (!InterPolys.IsEmpty() && OutOrSh2M.IsEmpty())
+            assert (true);
+#endif
+          if (modif_ls.IsEmpty())
+            ModifInpGroupList.append(SData); //non modified
+          else
+          {
+            TopTools_ListIteratorOfListOfShape itl_modif(modif_ls);
+            for (;itl_modif.More();itl_modif.Next())
+            {
+              const TopoDS_Shape& CSH = itl_modif.Value();
+              if (CSH.ShapeType() == TopAbs_EDGE)
+              {
+                SplitData NewSData;
+                NewSData.ObjectNames = SData.ObjectNames;
+                NewSData.Type = SData.Type;
+                NewSData.Shape = CSH;
+                ModifInpGroupList.append(NewSData);
+              }
+            }
+          }
+
+        }
+        anOutputSplitDataList.append(ModifInpGroupList);
+      }
       return anOutputSplitDataList;
     }
     else
@@ -343,7 +403,7 @@ HYDROData_SplitToZonesTool::SplitDataList
           aList.Clear();
           Standard_Boolean foundE(Standard_False);
           const TopTools_ListOfShape& aListM = splitTool.Modified(exp.Current()); 
-#ifdef NDEBUG
+#ifndef NDEBUG
           DEBTRACE("NB_EDGE_M = " << aListM.Extent());
 #endif
           if(aListM.Extent()) foundE = Standard_True;
@@ -423,7 +483,7 @@ HYDROData_SplitToZonesTool::SplitDataList
               const TopoDS_Shape& aFace = exp.Current();
               if(!aFace.IsNull()) {
                 const TopTools_ListOfShape& aListOfNew = mkCom.Modified(aFace);
-#ifdef NDEBUG
+#ifndef NDEBUG
                 DEBTRACE("Modified: " << aListOfNew.Extent());
 #endif
                 if(!aListOfNew.IsEmpty()) {
@@ -688,7 +748,7 @@ void HYDROData_SplitToZonesTool::AddInternalEdges(HYDROData_DataMapOfShapeListOf
     TopTools_ListOfShape out;
     if (K.ShapeType() == TopAbs_FACE)
     {
-      CutByEdges(K, Wires, out, &OutNE1);
+      CutByEdges(K, Wires, out, &OutNE1, NULL);
       TopTools_ListIteratorOfListOfShape it(out);
       for (;it.More(); it.Next())
       {
@@ -710,7 +770,8 @@ void HYDROData_SplitToZonesTool::AddInternalEdges(HYDROData_DataMapOfShapeListOf
 void HYDROData_SplitToZonesTool::CutFaceByEdges(const TopoDS_Face& in, 
                                                 TopTools_ListOfShape& out, 
                                                 const HYDROData_SequenceOfObjects& thePolylines,
-                                                NCollection_DataMap<TopoDS_Shape, Handle(HYDROData_PolylineXY), TopTools_ShapeMapHasher>* OutNE)
+                                                NCollection_DataMap<TopoDS_Shape, Handle(HYDROData_PolylineXY), TopTools_ShapeMapHasher>* OutNE,                                                
+                                                TopTools_IndexedDataMapOfShapeListOfShape* OutOrSh2M)
 {
 
   HYDROData_SequenceOfObjects::Iterator it(thePolylines);
@@ -725,7 +786,7 @@ void HYDROData_SplitToZonesTool::CutFaceByEdges(const TopoDS_Face& in,
   }
 
   TopTools_IndexedDataMapOfShapeShape OutNE1;
-  CutByEdges(in, Wires, out, &OutNE1);
+  CutByEdges(in, Wires, out, &OutNE1, OutOrSh2M);
 
   for (int i = 1; i <= OutNE1.Extent(); i++)
     OutNE->Bind(OutNE1.FindKey(i), W2P(OutNE1.FindFromIndex(i)));
@@ -733,7 +794,9 @@ void HYDROData_SplitToZonesTool::CutFaceByEdges(const TopoDS_Face& in,
 }
 
 int HYDROData_SplitToZonesTool::CutByEdges(const TopoDS_Shape& InSh, const TopTools_ListOfShape& InW,
-  TopTools_ListOfShape& outShs, TopTools_IndexedDataMapOfShapeShape* OutNE)
+                                           TopTools_ListOfShape& outShs, 
+                                           TopTools_IndexedDataMapOfShapeShape* OutNE, 
+                                           TopTools_IndexedDataMapOfShapeListOfShape* OInSH2MSH)
 {
   int anError;
   if (InSh.IsNull())
@@ -791,7 +854,19 @@ int HYDROData_SplitToZonesTool::CutByEdges(const TopoDS_Shape& InSh, const TopTo
       if (AllEdges.Contains(CE))
         OutNE->Add(CE, V);
     }
+  }
 
+  //map all sub-shapes from the original InSh to modified shapes  
+  if (OInSH2MSH)
+  {
+    TopTools_IndexedMapOfShape allSh;
+    TopExp::MapShapes(InSh, allSh);
+    for(int i = 1; i <= allSh.Extent(); i++ )
+    {
+      const TopoDS_Shape& or_sh = allSh(i); 
+      const TopTools_ListOfShape& ls = anAlgo.Modified(or_sh);
+      OInSH2MSH->Add(or_sh, ls);
+    }
   }
 
   return 0;