]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
refs #673: edge discretization algorithm
authorasl <asl@opencascade.com>
Fri, 16 Oct 2015 08:48:04 +0000 (11:48 +0300)
committerasl <asl@opencascade.com>
Fri, 16 Oct 2015 09:13:37 +0000 (12:13 +0300)
src/HYDROData/HYDROData_LandCoverMap.cxx
src/HYDROData/HYDROData_LandCoverMap.h

index 6f7ecb62f9f9c33612944b1759fbf06421fedb44..574b1e004c689e97edcb10810254c9b47bc48b4d 100644 (file)
 #include <BOPAlgo_PaveFiller.hxx>
 #include <BOPCol_ListOfShape.hxx>
 #include <BRep_Builder.hxx>
+#include <BRepAdaptor_Curve.hxx>
 #include <BRepAlgoAPI_Fuse.hxx>
 #include <BRepBuilderAPI_MakeFace.hxx>
+#include <GCPnts_QuasiUniformDeflection.hxx>
 #include <NCollection_IndexedMap.hxx>
 #include <TopoDS.hxx>
 #include <TopoDS_Compound.hxx>
@@ -191,11 +193,43 @@ bool HYDROData_LandCoverMap::ExportQGIS( const QString& theFileName ) const
   return false;
 }
 
-void EdgeDiscretization( const TopoDS_Edge& theEdge, 
+int HashCode( const gp_Pnt& thePoint, const Standard_Integer theUpper )
+{
+  int aHashX = HashCode( thePoint.X(), theUpper );
+  int aHashY = HashCode( thePoint.Y(), theUpper );
+  return (aHashX^aHashY)%theUpper;
+}
+
+bool operator == ( const gp_Pnt& thePoint1, const gp_Pnt& thePoint2 )
+{
+  return thePoint1.IsEqual( thePoint2, Precision::Confusion() );
+}
+
+bool EdgeDiscretization( const TopoDS_Edge& theEdge, 
+                         Standard_Real theDeflection,
                          NCollection_IndexedMap<gp_Pnt>& theVerticesMap,
                          QList<int>& theVerticesIds )
 {
-  //TODO
+  BRepAdaptor_Curve aCurve( theEdge );
+  GCPnts_QuasiUniformDeflection aDiscrete( aCurve, theDeflection );
+  if( !aDiscrete.IsDone() )
+    return false;
+
+  int n = aDiscrete.NbPoints();
+  for( int i=1; i<=n; i++ )
+  {
+    gp_Pnt aPnt = aDiscrete.Value( i );
+    int anId;
+    if( theVerticesMap.Contains( aPnt ) )
+      anId = theVerticesMap.FindIndex( aPnt );
+    else
+    {
+      anId = theVerticesMap.Size();
+      theVerticesMap.Add( aPnt );
+    }
+    theVerticesIds.append( anId );
+  }
+  return true;
 }
 
 /**
@@ -203,7 +237,7 @@ void EdgeDiscretization( const TopoDS_Edge& theEdge,
   @param theFileName the name of file
   @return if the export is successful
 */
-bool HYDROData_LandCoverMap::ExportTelemac( const QString& theFileName ) const
+bool HYDROData_LandCoverMap::ExportTelemac( const QString& theFileName, Standard_Real theDeflection ) const
 {
   TopoDS_Shell aShell;  //TODO: unite all the faces of land covers into the shell
 
@@ -217,8 +251,8 @@ bool HYDROData_LandCoverMap::ExportTelemac( const QString& theFileName ) const
   {
     TopoDS_Edge anEdge = TopoDS::Edge( anExp1.Current() );
     QList<int> aVerticesIdsList;
-    EdgeDiscretization( anEdge, aVerticesMap, aVerticesIdsList );
-    anEdgesMap.Add( anEdge, aVerticesIdsList );
+    if( EdgeDiscretization( anEdge, theDeflection, aVerticesMap, aVerticesIdsList ) )
+      anEdgesMap.Add( anEdge, aVerticesIdsList );
   }
 
   // add into the map all faces existing in the shell and correspondence between face and edges ids
@@ -389,7 +423,7 @@ bool HYDROData_LandCoverMap::Merge( const TopTools_ListOfShape& theFaces, const
   // 2. to fuse the faces into the new face
   /*BOPAlgo_PaveFiller aPF;
   aPF.SetArguments( theFaces );
-  aPF.SetFuzzyValue( 1E-2 ); 
+  aPF.SetFuzzyValue( 1E-5 ); 
   aPF.SetRunParallel( Standard_False );
   aPF.Perform();
   int iErr = aPF.ErrorStatus();
index 09ae68eb4bd4276848a41e7b471b7ee097b55c03..fe79b2ec8c749c84783e09a844ce979f7f20b3a8 100644 (file)
@@ -73,7 +73,7 @@ public:
 
   bool ImportQGIS( const QString& theFileName );
   bool ExportQGIS( const QString& theFileName ) const;
-  bool ExportTelemac( const QString& theFileName ) const;
+  bool ExportTelemac( const QString& theFileName, Standard_Real theDeflection ) const;
 
   bool Add( const Handle( HYDROData_Object )&, const QString& theType );
   bool Add( const Handle( HYDROData_PolylineXY )&, const QString& theType );