X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_SplitToZonesTool.cxx;h=8784a1e5f31f9a008241221c5e86ac2e7e652b30;hb=0f4c16e80e5c9160fb6e240e3f09b151701a1e5b;hp=2836229ae258c99d95418898cae18777c6edae4e;hpb=7692769e88ee24d96e7acdf96ef13151f83037c4;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_SplitToZonesTool.cxx b/src/HYDROData/HYDROData_SplitToZonesTool.cxx index 2836229a..8784a1e5 100644 --- a/src/HYDROData/HYDROData_SplitToZonesTool.cxx +++ b/src/HYDROData/HYDROData_SplitToZonesTool.cxx @@ -44,6 +44,7 @@ #include #include #include +#include //#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* OutNE) + NCollection_DataMap* 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;