+static void FilterEdgesByIncludeSelectionBoundaryPolygons( const HYDROData_SplitToZonesTool::SplitDataList& anEdgesList,
+ HYDROData_SequenceOfObjects aBoundaryPolygons,
+ HYDROData_SplitToZonesTool::SplitDataList& outEdgesList)
+{
+ //perform boundary condition polygons on EdgesList
+ TopTools_SequenceOfShape IncTools, SelectionTools;
+ HYDROData_SplitToZonesTool::SplitDataListIterator anIter(anEdgesList);
+ for (int i=1; i<=aBoundaryPolygons.Size();i++)
+ {
+ Handle(HYDROData_BCPolygon) aBCPoly = Handle(HYDROData_BCPolygon)::DownCast( aBoundaryPolygons(i));
+ TopoDS_Shape aPolyTopShape = aBCPoly->GetTopShape();
+ int bType = aBCPoly->GetBoundaryType();
+ if (bType == 2)
+ IncTools.Append(aPolyTopShape);
+ else if (bType == 3)
+ SelectionTools.Append(aPolyTopShape);
+ }
+
+ while( anIter.hasNext() )
+ {
+ const HYDROData_SplitToZonesTool::SplitData& aSplitData = anIter.next();
+ if ( aSplitData.ObjectNames.isEmpty() || aSplitData.Shape.IsNull() )
+ continue;
+ if (aSplitData.Shape.ShapeType() != TopAbs_EDGE)
+ continue;
+ if (HYDROData_BoundaryPolygonTools::IncludeTool(IncTools, aSplitData.Shape) && HYDROData_BoundaryPolygonTools::SelectionTool(SelectionTools, aSplitData.Shape))
+ outEdgesList.append(aSplitData);
+ }
+}
+
+
+static void SplitEdgesByBoundaryPolygons( const HYDROData_SplitToZonesTool::SplitDataList& anEdgesList,
+ const HYDROData_SequenceOfObjects& aBoundaryPolygons,
+ NCollection_IndexedDataMap<TopoDS_Shape, TopoDS_Shape>& ObjToRes)
+{
+ //perform boundary condition polygons on EdgesList
+ TopTools_SequenceOfShape CutTools;
+ ObjToRes.Clear();
+ HYDROData_SplitToZonesTool::SplitDataListIterator anIter(anEdgesList);
+ for (int i=1; i<=aBoundaryPolygons.Size();i++)
+ {
+ Handle(HYDROData_BCPolygon) aBCPoly = Handle(HYDROData_BCPolygon)::DownCast( aBoundaryPolygons(i));
+ TopoDS_Shape aPolyTopShape = aBCPoly->GetTopShape();
+ int bType = aBCPoly->GetBoundaryType();
+ if (bType == 1)
+ CutTools.Append(aPolyTopShape);
+ }
+
+ while( anIter.hasNext() )
+ {
+ const HYDROData_SplitToZonesTool::SplitData& aSplitData = anIter.next();
+ if ( aSplitData.ObjectNames.isEmpty() || aSplitData.Shape.IsNull() )
+ continue;
+ if (aSplitData.Shape.ShapeType() != TopAbs_EDGE)
+ continue;
+ ObjToRes.Add(aSplitData.Shape, TopoDS_Shape());
+ }
+
+ HYDROData_BoundaryPolygonTools::CutTool(CutTools, ObjToRes);
+}
+
+
+static void PerformEdgeReplInZones(const HYDROData_SplitToZonesTool::SplitDataList& ZoneList,
+ const NCollection_IndexedDataMap<TopoDS_Shape, TopoDS_Shape>& ObjToRes,
+ HYDROData_SplitToZonesTool::SplitDataList& outZoneList)
+{
+ HYDROData_SplitToZonesTool::SplitDataListIterator it( ZoneList );
+ BRepTools_ReShape reshaper;
+ for (;it.hasNext();)
+ {
+ const HYDROData_SplitToZonesTool::SplitData& aSplitData = it.next();
+ if ( aSplitData.ObjectNames.isEmpty() || aSplitData.Shape.IsNull() )
+ continue;
+
+ TopoDS_Shape mS = aSplitData.Shape;
+ for (int i=1; i<=ObjToRes.Extent();i++)
+ {
+ TopoDS_Shape K = ObjToRes.FindKey(i);
+ TopoDS_Shape V = ObjToRes.FindFromIndex(i);
+ if (V.ShapeType() != TopAbs_EDGE && V.ShapeType() != TopAbs_WIRE && V.ShapeType() != TopAbs_COMPOUND)
+ continue;
+ if (V.ShapeType() == TopAbs_COMPOUND)
+ {
+ TopExp_Explorer exp(V, TopAbs_EDGE);
+ TopTools_ListOfShape lE;
+ for (;exp.More();exp.Next())
+ lE.Append(exp.Current());
+ if (lE.Extent() == 1)
+ V = lE.First();
+ else if (lE.Extent() > 1)
+ {
+ BRepLib_MakeWire MW;
+ MW.Add(lE);
+ if (MW.IsDone())
+ V = MW.Wire();
+ else
+ continue;
+ }
+ else
+ continue;
+ }
+ reshaper.Replace(K, V);
+ }
+ TopoDS_Shape nS = reshaper.Apply(mS);
+ HYDROData_SplitToZonesTool::SplitData aNS(aSplitData.Type, nS, aSplitData.ObjectNames);
+ outZoneList.append(aNS);
+ }
+}
+
+static void CreateNewEdgeList( const HYDROData_SplitToZonesTool::SplitDataList& theEdges,
+ const NCollection_IndexedDataMap<TopoDS_Shape, TopoDS_Shape>& ObjToRes,
+ HYDROData_SplitToZonesTool::SplitDataList& newEdges)
+{
+ HYDROData_SplitToZonesTool::SplitDataListIterator anIter( theEdges );
+ while( anIter.hasNext() )
+ {
+ const HYDROData_SplitToZonesTool::SplitData& aSplitData = anIter.next();
+ if ( aSplitData.ObjectNames.isEmpty() || aSplitData.Shape.IsNull() )
+ continue;
+
+ const TopoDS_Shape* aDivShape = ObjToRes.Seek(aSplitData.Shape);
+ if (aDivShape)
+ {
+ TopExp_Explorer exp(*aDivShape, TopAbs_EDGE);
+ for (;exp.More();exp.Next())
+ {
+ HYDROData_SplitToZonesTool::SplitData anNewSData(aSplitData.Type, exp.Current(), aSplitData.ObjectNames);
+ newEdges.append(anNewSData);
+ }
+ }
+ else
+ newEdges.append(aSplitData);
+ }
+}
+
+