]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
refs #650: local partition algorithm
authorasl <asl@opencascade.com>
Tue, 13 Oct 2015 14:27:44 +0000 (17:27 +0300)
committerasl <asl@opencascade.com>
Tue, 13 Oct 2015 14:27:44 +0000 (17:27 +0300)
src/HYDROData/HYDROData_LandCoverMap.cxx

index 5c1f9e39ae0bea42a7ae559d4ee391b370d975f7..ee6119e5b71bd4551e788abd5e05cee5427766d3 100644 (file)
@@ -245,7 +245,66 @@ void HYDROData_LandCoverMap::SetShape( const TopoDS_Shape& theShape )
 */
 bool HYDROData_LandCoverMap::LocalPartition( const TopoDS_Shape& theNewShape, const QString& theNewType )
 {
-  //TODO
+  BOPCol_ListOfShape aShapesList;
+  BOPAlgo_PaveFiller aPaveFiller;
+
+  // add faces to shapes list
+  Iterator anIt( *this );
+  for( ; anIt.More(); anIt.Next() )
+    aShapesList.Append( anIt.Face() );
+  aShapesList.Append( theNewShape );
+
+  // prepare pave filler
+  aPaveFiller.SetArguments( aShapesList );
+  aPaveFiller.Perform();
+  Standard_Integer anError = aPaveFiller.ErrorStatus();
+  if( anError )
+    return false;
+
+  // add faces to builder
+  BOPAlgo_Builder aBuilder;
+  anIt.Init( *this );
+  for( ; anIt.More(); anIt.Next() )
+    aBuilder.AddArgument( anIt.Face() );
+  aBuilder.AddArgument( theNewShape );
+
+  // perform the partition with the pave filler
+  aBuilder.PerformWithFiller( aPaveFiller );
+  anError = aBuilder.ErrorStatus();
+  if( anError )
+    return false;
+
+  // analysis of the history
+  BOPCol_DataMapOfShapeListOfShape aSplits = aBuilder.Splits();
+
+  //     a. fill map of shape => type for initial faces
+  HYDROData_MapOfShapeToStricklerType anOldFaces;
+  anIt.Init( *this );
+  for( ; anIt.More(); anIt.Next() )
+    anOldFaces.Add( anIt.Face(), anIt.StricklerType() );
+
+  //     b. fill map of shape => type for split faces without the new face
+  HYDROData_MapOfShapeToStricklerType aNewFaces;
+  BOPCol_DataMapOfShapeListOfShape::Iterator aSplitIt( aSplits );
+  for( ; aSplitIt.More(); aSplitIt.Next() )
+  {
+    TopoDS_Shape anInitial = aSplitIt.Key();
+    if( anInitial==theNewShape )
+      continue;
+    QString aType = anOldFaces.FindFromKey( anInitial );
+    BOPCol_ListOfShape aSplitFaces = aSplitIt.Value();
+    BOPCol_ListOfShape::Iterator aSFIt( aSplitFaces );
+    for( ; aSFIt.More(); aSFIt.Next() )
+      aNewFaces.Add( aSFIt.Value(), aType );
+  }
+
+  //     c. add the new shape if it is face with its type
+  if( theNewShape.ShapeType()==TopAbs_FACE )
+    aNewFaces.Add( theNewShape, theNewType );
+  
+  // convert map of shape to type to compound and list of types
+  StoreLandCovers( aNewFaces );
+  return true;
 }
 
 /**