Salome HOME
Merge branch 'BR_H2018_3' into BR_2018_V8_5
[modules/hydro.git] / src / HYDRO_tests / test_HYDROData_BoundaryPolygons.cxx
1 // Copyright (C) 2014-2015  EDF-R&D
2 // This library is free software; you can redistribute it and/or
3 // modify it under the terms of the GNU Lesser General Public
4 // License as published by the Free Software Foundation; either
5 // version 2.1 of the License, or (at your option) any later version.
6 //
7 // This library is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10 // Lesser General Public License for more details.
11 //
12 // You should have received a copy of the GNU Lesser General Public
13 // License along with this library; if not, write to the Free Software
14 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
15 //
16 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
17 //
18
19 #include <test_HYDROData_BoundaryPolygons.h>
20 #include <HYDROData_Document.h>
21 #include <HYDROData_CalculationCase.h>
22 #include <QTest>
23 #include <BRep_Builder.hxx>
24 #include <TopExp.hxx>
25 #include <GProp_GProps.hxx>
26 #include <BRepGProp.hxx>
27 #include <HYDROData_ShapesGroup.h>
28 #include <HYDROData_BCPolygon.h>
29 #include <TopExp_Explorer.hxx>
30
31 extern QString REF_DATA_PATH;
32
33 void test_HYDROData_BoundaryPolygons::test_bp_1()
34 {  
35   TCollection_AsciiString fname = REF_DATA_PATH.toLatin1().data();
36   fname += "/test_boundary_polygon_calc_case_1.cbf";
37   CPPUNIT_ASSERT_EQUAL( (int)DocError_OK, (int)HYDROData_Document::Load( fname.ToCString(), 1 ) );
38
39   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document(1);  
40   //Calc case already contains already contains 4 boundary poltgons (3 cut, 1 include)
41   //Update it to recalculate the shape groups
42   Handle(HYDROData_CalculationCase) aCase = 
43     Handle(HYDROData_CalculationCase)::DownCast( aDoc->FindObjectByName( "Case_1" ) );
44   CPPUNIT_ASSERT_EQUAL( false, aCase.IsNull() ); 
45   aCase->Update();
46   CPPUNIT_ASSERT_EQUAL(4, aCase->GetBoundaryPolygons().Size());
47   HYDROData_SequenceOfObjects aSplitGroups = aCase->GetSplitGroups();
48   CPPUNIT_ASSERT_EQUAL(4, aSplitGroups.Size());
49
50   Handle(HYDROData_ShapesGroup) aGroup1;
51   TopTools_MapOfShape EdgesFromBPGroups;
52   for (int i=1; i<=4;i++)
53   {
54     Handle(HYDROData_ShapesGroup) aGroup = Handle(HYDROData_ShapesGroup)::DownCast( aSplitGroups(i) );    
55     if (aGroup->GetName() == "Case_1_Immersible zone_1_Outer")
56     {
57       aGroup1 = aGroup;
58     }
59     else
60     {
61       TopTools_SequenceOfShape aSeqShapes1;
62       aGroup->GetShapes( aSeqShapes1 );
63       for (int j=1; j<=aSeqShapes1.Size();j++)
64       {
65         TopExp_Explorer exp(aSeqShapes1(j), TopAbs_EDGE);
66         for (;exp.More();exp.Next())
67           EdgesFromBPGroups.Add(exp.Current());
68       }
69     }
70   }
71   CPPUNIT_ASSERT( !aGroup1.IsNull() ); 
72
73   TopTools_SequenceOfShape aSeqShapes;
74   aGroup1->GetShapes( aSeqShapes );  
75   CPPUNIT_ASSERT_EQUAL( 78, aSeqShapes.Size());
76   //
77   TopTools_MapOfShape EdgesFromOuter;
78
79   for (int i=1;i<=aSeqShapes.Size();i++)
80     EdgesFromOuter.Add(aSeqShapes(i));
81
82   //check that EdgesFromBPGroups is a PART of Case_1_Immersible zone_1_Outer group
83   int ext1 = EdgesFromBPGroups.Extent();
84   EdgesFromOuter.Intersect(EdgesFromBPGroups);
85   int ext2 = EdgesFromOuter.Extent();
86   CPPUNIT_ASSERT_EQUAL(35, ext1);
87   CPPUNIT_ASSERT_EQUAL(ext1, ext2);
88   //
89   BRep_Builder BB;
90   TopTools_IndexedMapOfShape ME, MV;
91   GProp_GProps G;
92   double total_len = 0;
93   for (int i=1; i<=aSeqShapes.Size();i++)
94   {
95     const TopoDS_Shape& aCSH = aSeqShapes(i);
96     TopExp::MapShapes(aCSH, TopAbs_EDGE, ME);
97     TopExp::MapShapes(aCSH, TopAbs_VERTEX, MV);
98     BRepGProp::LinearProperties(aCSH, G);
99     total_len += G.Mass();
100   }
101   CPPUNIT_ASSERT_EQUAL( 78, ME.Extent());
102   CPPUNIT_ASSERT_EQUAL( 78, MV.Extent());
103   CPPUNIT_ASSERT_DOUBLES_EQUAL(  22.074, total_len , 0.001);
104
105   aDoc->Close();
106 }
107
108 void test_HYDROData_BoundaryPolygons::test_bp_2()
109 {
110   TCollection_AsciiString fname = REF_DATA_PATH.toLatin1().data();
111   fname += "/test_boundary_polygon_calc_case_2.cbf";
112   CPPUNIT_ASSERT_EQUAL( (int)DocError_OK, (int)HYDROData_Document::Load( fname.ToCString(), 1 ) );
113   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document(1);
114   //add boundary polygons to case_1
115   Handle(HYDROData_CalculationCase) aCase = 
116     Handle(HYDROData_CalculationCase)::DownCast( aDoc->FindObjectByName( "Case_1" ) );
117   CPPUNIT_ASSERT_EQUAL( false, aCase.IsNull() ); 
118   double len1=0, len2=0;
119   {
120     //check linear properties before applying of boundary polygons
121     CPPUNIT_ASSERT_EQUAL(0, aCase->GetBoundaryPolygons().Size());
122     HYDROData_SequenceOfObjects aSplitGroups = aCase->GetSplitGroups();
123     Handle(HYDROData_ShapesGroup) aGroup = Handle(HYDROData_ShapesGroup)::DownCast( aSplitGroups.First() );
124     std::string name = aGroup->GetName().toStdString();
125     CPPUNIT_ASSERT_EQUAL( name, std::string("Case_1_Immersible zone_1_Outer") ); 
126     TopTools_SequenceOfShape aSeqShapes;
127     aGroup->GetShapes( aSeqShapes );  
128     CPPUNIT_ASSERT_EQUAL( 36, aSeqShapes.Size());
129     TopTools_IndexedMapOfShape ME, MV;
130     GProp_GProps G;
131     for (int i=1; i<=aSeqShapes.Size();i++)
132     {
133       const TopoDS_Shape& aCSH = aSeqShapes(i);
134       BRepGProp::LinearProperties(aCSH, G);
135       len1 += G.Mass();
136     }
137     CPPUNIT_ASSERT_DOUBLES_EQUAL(  22.074, len1 , 0.001);
138   }
139
140   //add boudnary polygons to case_1. (3 cut tools, 1 include tool)
141   Handle(HYDROData_BCPolygon) aBP3 = Handle(HYDROData_BCPolygon)::DownCast( aDoc->FindObjectByName("BP_poly3"));
142   aCase->AddBoundaryPolygon(aBP3);
143   Handle(HYDROData_BCPolygon) aBP4 = Handle(HYDROData_BCPolygon)::DownCast( aDoc->FindObjectByName("BP_poly4"));
144   aCase->AddBoundaryPolygon(aBP4);
145   Handle(HYDROData_BCPolygon) aBP5 = Handle(HYDROData_BCPolygon)::DownCast( aDoc->FindObjectByName("BP_poly5"));
146   aCase->AddBoundaryPolygon(aBP5);
147   Handle(HYDROData_BCPolygon) aBP6 = Handle(HYDROData_BCPolygon)::DownCast( aDoc->FindObjectByName("BP_poly6"));
148   aCase->AddBoundaryPolygon(aBP6);
149
150   aCase->Update();
151   {
152     //check linear properties after applying of boundary polygons
153     HYDROData_SequenceOfObjects aSplitGroups = aCase->GetSplitGroups();
154     Handle(HYDROData_ShapesGroup) aGroup = Handle(HYDROData_ShapesGroup)::DownCast( aSplitGroups.First() );
155     std::string name = aGroup->GetName().toStdString();
156     CPPUNIT_ASSERT_EQUAL( name, std::string("Case_1_Immersible zone_1_Outer") ); 
157
158     TopTools_SequenceOfShape aSeqShapes;
159     aGroup->GetShapes( aSeqShapes );  
160     CPPUNIT_ASSERT_EQUAL( 78, aSeqShapes.Size());
161     BRep_Builder BB;
162     TopTools_IndexedMapOfShape ME, MV;
163     GProp_GProps G;
164
165     for (int i=1; i<=aSeqShapes.Size();i++)
166     {
167       const TopoDS_Shape& aCSH = aSeqShapes(i);
168       TopExp::MapShapes(aCSH, TopAbs_EDGE, ME);
169       TopExp::MapShapes(aCSH, TopAbs_VERTEX, MV);
170       BRepGProp::LinearProperties(aCSH, G);
171       len2 += G.Mass();
172     }
173     CPPUNIT_ASSERT_EQUAL( 78, ME.Extent());
174     CPPUNIT_ASSERT_EQUAL( 78, MV.Extent());
175     //len1 == len2
176     CPPUNIT_ASSERT_DOUBLES_EQUAL( 22.074, len2, 0.001);
177   }
178
179   aDoc->Close();
180
181