From 6bd00c0eff60ae46298986ee0c87b616eafc69bc Mon Sep 17 00:00:00 2001 From: asl Date: Thu, 15 Oct 2015 15:06:03 +0300 Subject: [PATCH] #669: draft implementation of the merge algorithm --- src/HYDROData/HYDROData_LandCoverMap.cxx | 44 +++++++++++++++-- src/HYDROData/HYDROData_LandCoverMap.h | 3 ++ .../test_HYDROData_LandCoverMap.cxx | 48 ++++++++++++++++++- src/HYDRO_tests/test_HYDROData_LandCoverMap.h | 2 + 4 files changed, 91 insertions(+), 6 deletions(-) diff --git a/src/HYDROData/HYDROData_LandCoverMap.cxx b/src/HYDROData/HYDROData_LandCoverMap.cxx index 76ec9364..8efeb107 100644 --- a/src/HYDROData/HYDROData_LandCoverMap.cxx +++ b/src/HYDROData/HYDROData_LandCoverMap.cxx @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -293,13 +294,25 @@ bool HYDROData_LandCoverMap::Merge( const TopTools_ListOfShape& theFaces, const Remove( theFaces ); // 2. to fuse the faces into the new face - BRepAlgoAPI_Fuse aFuse; - aFuse.SetArguments( theFaces ); - aFuse.Build(); - if( !aFuse.IsDone() ) + BOPAlgo_PaveFiller aPF; + aPF.SetArguments( theFaces ); + aPF.SetFuzzyValue( 1E-2 ); + aPF.SetRunParallel( Standard_False ); + aPF.Perform(); + int iErr = aPF.ErrorStatus(); + if( iErr ) return false; - TopoDS_Shape aMergedShape = aFuse.Shape(); + BOPAlgo_BOP aBOP; + aBOP.SetArguments( theFaces ); + aBOP.SetOperation( BOPAlgo_FUSE ); + aBOP.SetRunParallel( Standard_False ); + aBOP.PerformWithFiller(aPF); + iErr = aBOP.ErrorStatus(); + if( iErr ) + return false; + + TopoDS_Shape aMergedShape = aBOP.Shape(); if( aMergedShape.ShapeType()!=TopAbs_FACE ) return false; @@ -436,3 +449,24 @@ void HYDROData_LandCoverMap::StoreLandCovers( const HYDROData_MapOfFaceToStrickl SetShape( aCompound ); } + +/** + Find the land cover for the given point + @param thePoint the point laying in some land cover + @param theType the returned type + @return the found land cover's face +*/ +TopoDS_Face HYDROData_LandCoverMap::FindByPoint( const gp_Pnt2d& thePoint, QString& theType ) const +{ + //TODO: some more optimal algorithm + Iterator anIt( *this ); + for( ; anIt.More(); anIt.Next() ) + if( HYDROData_Tool::ComputePointState( thePoint.XY(), anIt.Face() ) == TopAbs_IN ) + { + theType = anIt.StricklerType(); + return anIt.Face(); + } + + theType = ""; + return TopoDS_Face(); +} diff --git a/src/HYDROData/HYDROData_LandCoverMap.h b/src/HYDROData/HYDROData_LandCoverMap.h index ba5c5f68..3c0c834d 100644 --- a/src/HYDROData/HYDROData_LandCoverMap.h +++ b/src/HYDROData/HYDROData_LandCoverMap.h @@ -31,6 +31,7 @@ class TopTools_ListOfShape; class Handle( HYDROData_PolylineXY ); class Handle( HYDROData_Object ); class HYDROData_MapOfFaceToStricklerType; +class gp_Pnt2d; class HYDROData_LandCoverMap : public HYDROData_Entity { @@ -83,6 +84,8 @@ public: bool Split( const Handle( HYDROData_PolylineXY )& ); bool Merge( const TopTools_ListOfShape&, const QString& theType ); + TopoDS_Face FindByPoint( const gp_Pnt2d&, QString& theType ) const; + protected: TopoDS_Shape GetShape() const; void SetShape( const TopoDS_Shape& ); diff --git a/src/HYDRO_tests/test_HYDROData_LandCoverMap.cxx b/src/HYDRO_tests/test_HYDROData_LandCoverMap.cxx index b2c3ac69..7eb33b15 100644 --- a/src/HYDRO_tests/test_HYDROData_LandCoverMap.cxx +++ b/src/HYDRO_tests/test_HYDROData_LandCoverMap.cxx @@ -30,10 +30,13 @@ #include #include #include +#include #include #include #include +#include + TopoDS_Edge Spline( const QList& theXYList, bool isClosed = false ) { int n = theXYList.size()/2; @@ -118,7 +121,7 @@ void test_HYDROData_LandCoverMap::test_split_by_polyline() CPPUNIT_ASSERT_EQUAL( true, aMap->Split( aPolyline ) ); TestViewer::show( aMap->GetShape(), AIS_Shaded, true ); - //TestViewer::show( aWire, QColor(), 0 ); + TestViewer::show( aWire, QColor(), 0 ); TestViewer::AssertEqual( "LandCoverMap_Split_1" ); HYDROData_LandCoverMap::Iterator anIt( aMap ); @@ -132,3 +135,46 @@ void test_HYDROData_LandCoverMap::test_split_by_polyline() aDoc->Close(); } + +void test_HYDROData_LandCoverMap::test_merge() +{ + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document(1); + + Handle(HYDROData_LandCoverMap) aMap = + Handle(HYDROData_LandCoverMap)::DownCast( aDoc->CreateObject( KIND_LAND_COVER_MAP ) ); + + CPPUNIT_ASSERT_EQUAL( KIND_LAND_COVER_MAP, aMap->GetKind() ); + + TopoDS_Face aLC1 = LandCover( QList() << 12 << 19 << 82 << 9 << 126 << 53 << 107 << 80 << 29 << 75 ); + + CPPUNIT_ASSERT_EQUAL( true, aMap->LocalPartition( aLC1, "test1" ) ); + + TopoDS_Face aLC2 = LandCover( QList() << 21 << 34 << 24 << 25 << 37 << 37 << 40 << 61 << + 44 << 95 << 85 << 100 << 104 << 66 << 107 << 33 << + 128 << 18 << 140 << 50 << 131 << 89 << 104 << 111 << + 31 << 114 ); + CPPUNIT_ASSERT_EQUAL( true, aMap->LocalPartition( aLC2, "test2" ) ); + + TopoDS_Face aLC3 = LandCover( QList() << 4 << 54 << 1 << 47 << 51 << 45 << + 127 << 42 << 145 << 43 << 148 << 60 << 90 << 65 ); + CPPUNIT_ASSERT_EQUAL( true, aMap->LocalPartition( aLC3, "test3" ) ); + + //TestViewer::show( aMap->GetShape(), AIS_Shaded, true ); + //TestViewer::AssertEqual( "LandCoverMap_Before_Merge" ); + + //BRepTools::Write( aMap->GetShape(), "c:\\map.brep" ); + + QString aType1, aType2; + gp_Pnt2d aPnt1( 25, 35 ); + gp_Pnt2d aPnt2( 45, 55 ); + TopTools_ListOfShape aList; + aList.Append( aMap->FindByPoint( aPnt1, aType1 ) ); + aList.Append( aMap->FindByPoint( aPnt2, aType2 ) ); + CPPUNIT_ASSERT_EQUAL( true, aMap->Merge( aList, "new" ) ); + + TestViewer::show( aMap->GetShape(), AIS_Shaded, true ); + //TestViewer::show( BRepBuilderAPI_MakeEdge( aPnt1, aPnt2 ).Edge(), QColor( Qt::black ), AIS_Shaded ); + TestViewer::AssertEqual( "LandCoverMap_Merge_1" ); + + aDoc->Close(); +} diff --git a/src/HYDRO_tests/test_HYDROData_LandCoverMap.h b/src/HYDRO_tests/test_HYDROData_LandCoverMap.h index 95684210..726e4ffb 100644 --- a/src/HYDRO_tests/test_HYDROData_LandCoverMap.h +++ b/src/HYDRO_tests/test_HYDROData_LandCoverMap.h @@ -27,11 +27,13 @@ class test_HYDROData_LandCoverMap : public CppUnit::TestFixture CPPUNIT_TEST_SUITE( test_HYDROData_LandCoverMap ); CPPUNIT_TEST( test_add_2_objects ); CPPUNIT_TEST( test_split_by_polyline ); + CPPUNIT_TEST( test_merge ); CPPUNIT_TEST_SUITE_END(); public: void test_add_2_objects(); void test_split_by_polyline(); + void test_merge(); }; CPPUNIT_TEST_SUITE_REGISTRATION( test_HYDROData_LandCoverMap ); -- 2.39.2