Salome HOME
Correction for hydro_test
[modules/hydro.git] / src / HYDRO_tests / test_HYDROData_CalcCase.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_CalcCase.h>
20 #include <HYDROData_CalculationCase.h>
21 #include <HYDROData_Document.h>
22 #include <HYDROData_Tool.h>
23 #include <TopoDS_Edge.hxx>
24 #include <TopoDS_Wire.hxx>
25 #include <TopoDS_Face.hxx>
26 #include <TopoDS.hxx>
27 #include <TestViewer.h>
28 #include <TestShape.h>
29 #include <TopTools_ListOfShape.hxx>
30 #include <AIS_DisplayMode.hxx>
31 #include <QString>
32 #include <QColor>
33 #include <BRep_Builder.hxx>
34 #include <BRepTools.hxx>
35 #include <HYDROData_CompleteCalcCase.h>
36 #include <QSet>
37 #include <HYDROData_Region.h>
38 #include <TopExp.hxx>
39 #include <GProp_GProps.hxx>
40 #include <BRepGProp.hxx>
41
42 extern QString REF_DATA_PATH;
43
44 static TopoDS_Shape GetCalcCaseShape(Handle(HYDROData_CalculationCase) theCalcCase)
45 {
46   BRep_Builder B;
47   TopoDS_Compound cmp;
48   B.MakeCompound(cmp);
49   HYDROData_SequenceOfObjects aRegions = theCalcCase->GetRegions();
50   for ( int i = 1; i <= aRegions.Size(); i++ )
51   {
52     Handle(HYDROData_Region) aRegion = Handle(HYDROData_Region)::DownCast( aRegions(i) );
53     if ( !aRegion.IsNull() )
54     {
55       HYDROData_SequenceOfObjects aZones = aRegion->GetZones();
56       for ( int j = 1; j <= aZones.Size(); j++ )
57       {
58         Handle(HYDROData_Zone) aZone = Handle(HYDROData_Zone)::DownCast( aZones(j) );
59         TopoDS_Shape aSh = aZone->GetShape();
60         B.Add(cmp, aSh);
61       }
62     }
63   }
64   return cmp;
65 }
66
67 void test_HYDROData_CalcCase::test_add_int_wires()
68 {
69   {
70     TopoDS_Shape out;
71     TopTools_ListOfShape Wires;
72
73     BRep_Builder B;
74     TopoDS_Shape InF;
75     TopoDS_Shape InP;
76     BRepTools::Read(InP, (REF_DATA_PATH + "/p1.brep").toStdString().c_str(), B);
77     BRepTools::Read(InF, (REF_DATA_PATH + "/r2.brep").toStdString().c_str(), B);
78     Wires.Append(InP);
79
80     TopTools_ListOfShape OutSh;
81     TopTools_IndexedDataMapOfShapeShape ls;
82     HYDROData_SplitToZonesTool::CutByEdges(InF, Wires, OutSh, false, &ls, NULL);
83
84     CPPUNIT_ASSERT_EQUAL(2, OutSh.Extent());
85     TopoDS_Compound cmp;
86     B.MakeCompound(cmp);
87     B.Add(cmp, OutSh.First());
88     B.Add(cmp, OutSh.Last());
89     TestViewer::show( cmp, AIS_Shaded, true, "cc_int_w_1" );
90     //CPPUNIT_ASSERT_IMAGES
91   }
92
93   {
94     TopoDS_Shape out;
95     TopTools_ListOfShape Wires;
96
97     BRep_Builder B;
98     TopoDS_Shape InF;
99     TopoDS_Shape InP;
100     BRepTools::Read(InP, (REF_DATA_PATH + "/p2.brep").toStdString().c_str(), B);
101     BRepTools::Read(InF, (REF_DATA_PATH + "/r2.brep").toStdString().c_str(), B);
102     Wires.Append(InP);
103
104     TopTools_ListOfShape OutSh;
105     TopTools_IndexedDataMapOfShapeShape ls;
106     HYDROData_SplitToZonesTool::CutByEdges(InF, Wires, OutSh, false, &ls, NULL);
107     CPPUNIT_ASSERT_EQUAL(1, OutSh.Extent());
108     TestViewer::show( OutSh.First(), AIS_WireFrame, true, "cc_int_w_2" );
109     //CPPUNIT_ASSERT_IMAGES
110   }
111
112   {
113     TopoDS_Shape out;
114     TopTools_ListOfShape Wires;
115
116     BRep_Builder B;
117     TopoDS_Shape InF;
118     TopoDS_Shape InP;
119     BRepTools::Read(InP, (REF_DATA_PATH + "/p3.brep").toStdString().c_str(), B);
120     BRepTools::Read(InF, (REF_DATA_PATH + "/r2.brep").toStdString().c_str(), B);
121     Wires.Append(InP);
122
123     TopTools_ListOfShape OutSh;
124     TopTools_IndexedDataMapOfShapeShape ls;
125     HYDROData_SplitToZonesTool::CutByEdges(InF, Wires, OutSh, false, &ls, NULL);
126     CPPUNIT_ASSERT_EQUAL(1, OutSh.Extent());
127     TestViewer::show( OutSh.First(), AIS_WireFrame, true, "cc_int_w_3", 1, 1 );
128     CPPUNIT_ASSERT_IMAGES
129   }
130
131 }
132
133
134 void test_HYDROData_CalcCase::test_complete_1()
135 {  
136   TCollection_AsciiString fname = REF_DATA_PATH.toLatin1().data();
137   fname += "/study_cc_1.cbf";
138   CPPUNIT_ASSERT_EQUAL( (int)DocError_OK, (int)HYDROData_Document::Load( fname.ToCString() ) );
139
140   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();  
141
142   Handle(HYDROData_CalculationCase) aCase = 
143     Handle(HYDROData_CalculationCase)::DownCast( aDoc->FindObjectByName( "Case_1" ) );
144   CPPUNIT_ASSERT_EQUAL( false, aCase.IsNull() ); 
145   {
146     //before complet eeop
147     TopoDS_Shape cmp = GetCalcCaseShape(aCase);
148     TopTools_IndexedMapOfShape M;
149     TopExp::MapShapes(cmp, M);
150     CPPUNIT_ASSERT_EQUAL(29, M.Extent());
151     GProp_GProps G;
152     BRepGProp::SurfaceProperties(cmp, G);
153     CPPUNIT_ASSERT_DOUBLES_EQUAL( 179876.15713670343, G.Mass(), 0.001 );
154   }
155
156   NCollection_Sequence<Handle(HYDROData_Entity)> theNewObjects;
157   Handle(HYDROData_Entity) aNewZone = aDoc->FindObjectByName( "Immersible zone_4" );
158   Handle(HYDROData_Entity) aNewPoly = aDoc->FindObjectByName( "Polyline_5__BB" );
159   theNewObjects.Append(aNewZone);
160   theNewObjects.Append(aNewPoly);
161
162
163   bool is_int = false;
164   NCollection_Sequence<Handle(HYDROData_Region)> theNewRegions;
165   QSet<QString> newRegionEntries;
166   HYDROData_CompleteCalcCase::AddObjects(aDoc, aCase, theNewObjects, true, is_int, theNewRegions);  
167
168   /// check the result
169   CPPUNIT_ASSERT_EQUAL(false, is_int);
170
171   HYDROData_SequenceOfObjects aRegions = aCase->GetRegions();
172   CPPUNIT_ASSERT_EQUAL(4, aRegions.Size());
173
174   CPPUNIT_ASSERT_EQUAL(QString("OREG1"), aRegions(1)->GetName());
175   CPPUNIT_ASSERT_EQUAL(QString("OREGMIN"), aRegions(2)->GetName());
176   CPPUNIT_ASSERT_EQUAL(QString("OREG2"), aRegions(3)->GetName());
177   CPPUNIT_ASSERT_EQUAL(QString("Immersible zone_4_reg"), aRegions(4)->GetName());
178
179   HYDROData_SequenceOfObjects aZonesReg1 = Handle(HYDROData_Region)::DownCast( aRegions(1) )->GetZones();
180   CPPUNIT_ASSERT_EQUAL(3, aZonesReg1.Size());
181
182   HYDROData_SequenceOfObjects aZonesReg2 = Handle(HYDROData_Region)::DownCast( aRegions(2) )->GetZones();
183   CPPUNIT_ASSERT_EQUAL(1, aZonesReg2.Size());
184
185   HYDROData_SequenceOfObjects aZonesReg3 = Handle(HYDROData_Region)::DownCast( aRegions(3) )->GetZones();
186   CPPUNIT_ASSERT_EQUAL(3, aZonesReg3.Size());
187
188   HYDROData_SequenceOfObjects aZonesReg4 = Handle(HYDROData_Region)::DownCast( aRegions(4) )->GetZones();
189   CPPUNIT_ASSERT_EQUAL(5, aZonesReg4.Size());
190   
191   {
192     //REG 1; "OREG1"
193     std::set<std::string> aZonesReg1Names;
194     for ( int j = 1; j <= 3; j++ )
195     {
196       Handle(HYDROData_Zone) aZone = Handle(HYDROData_Zone)::DownCast( aZonesReg1(j) );
197       aZonesReg1Names.insert( aZone->GetName().toStdString());
198     }
199
200     std::set<std::string> aZonesReg1NamesExpect;
201     aZonesReg1NamesExpect.insert("Case_1_Zone_2");
202     aZonesReg1NamesExpect.insert("Case_1_Zone_1_1");
203     aZonesReg1NamesExpect.insert("Case_1_Zone_1_2");
204     CPPUNIT_ASSERT(aZonesReg1NamesExpect == aZonesReg1Names);
205   }
206   {
207     TopoDS_Shape cmp = GetCalcCaseShape(aCase);
208     TopTools_IndexedMapOfShape M;
209     TopExp::MapShapes(cmp, M);
210     CPPUNIT_ASSERT_EQUAL(72, M.Extent());
211     GProp_GProps G;
212     BRepGProp::SurfaceProperties(cmp, G);
213     CPPUNIT_ASSERT_DOUBLES_EQUAL( 196013.5, G.Mass(), 0.1 );
214     TestViewer::show( cmp, AIS_Shaded, true, "cc_complete_1" );
215     CPPUNIT_ASSERT_IMAGES
216   }
217
218   aDoc->Close();
219 }
220
221 void test_HYDROData_CalcCase::test_complete_2()
222 {  
223   TCollection_AsciiString fname = REF_DATA_PATH.toLatin1().data();
224   fname += "/study_cc_2.cbf";
225   CPPUNIT_ASSERT_EQUAL( (int)DocError_OK, (int)HYDROData_Document::Load( fname.ToCString() ) );
226
227   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();  
228
229   Handle(HYDROData_CalculationCase) aCase = 
230     Handle(HYDROData_CalculationCase)::DownCast( aDoc->FindObjectByName( "Case_1" ) );
231  
232   NCollection_Sequence<Handle(HYDROData_Entity)> theNewObjects;
233   Handle(HYDROData_Entity) aNewZone1 = aDoc->FindObjectByName( "Immersible zone_4" );
234   Handle(HYDROData_Entity) aNewZone2 = aDoc->FindObjectByName( "Immersible zone_5" );
235   Handle(HYDROData_Entity) aNewZone3 = aDoc->FindObjectByName( "Immersible zone_6" );
236   Handle(HYDROData_Entity) aNewPoly1 = aDoc->FindObjectByName( "Polyline___BB" );
237   Handle(HYDROData_Entity) aNewPoly2 = aDoc->FindObjectByName( "Polyline_1" );
238   Handle(HYDROData_Entity) aNewPoly3 = aDoc->FindObjectByName( "Polyline_2" );
239   Handle(HYDROData_Entity) aNewPoly4 = aDoc->FindObjectByName( "Polyline_3" );
240   Handle(HYDROData_Entity) aNewPoly5 = aDoc->FindObjectByName( "Polyline_4" );
241   Handle(HYDROData_Entity) aNewPoly6 = aDoc->FindObjectByName( "Polyline_5" );
242   Handle(HYDROData_Entity) aNewPoly7 = aDoc->FindObjectByName( "Polyline_6" );
243   Handle(HYDROData_Entity) aNewPoly8 = aDoc->FindObjectByName( "Polyline_7" );
244   Handle(HYDROData_Entity) aNewPoly9 = aDoc->FindObjectByName( "Polyline_8" );
245
246   theNewObjects.Append(aNewZone1);
247   theNewObjects.Append(aNewZone2);
248   theNewObjects.Append(aNewZone3);
249   theNewObjects.Append(aNewPoly1);
250   theNewObjects.Append(aNewPoly2);
251   theNewObjects.Append(aNewPoly3);
252   theNewObjects.Append(aNewPoly4);
253   theNewObjects.Append(aNewPoly5);
254   theNewObjects.Append(aNewPoly6);
255   theNewObjects.Append(aNewPoly7);
256   theNewObjects.Append(aNewPoly8);
257   theNewObjects.Append(aNewPoly9);
258
259   bool is_int = false;
260   NCollection_Sequence<Handle(HYDROData_Region)> theNewRegions;
261   QSet<QString> newRegionEntries;
262   HYDROData_CompleteCalcCase::AddObjects(aDoc, aCase, theNewObjects, true, is_int, theNewRegions);  
263
264   /// check the result
265   CPPUNIT_ASSERT_EQUAL(true, is_int);
266
267   HYDROData_SequenceOfObjects aRegions = aCase->GetRegions();
268   CPPUNIT_ASSERT_EQUAL(6, aRegions.Size());
269
270   CPPUNIT_ASSERT_EQUAL(QString("OREG1"), aRegions(1)->GetName());
271   CPPUNIT_ASSERT_EQUAL(QString("OREGMIN"), aRegions(2)->GetName());
272   CPPUNIT_ASSERT_EQUAL(QString("OREG2"), aRegions(3)->GetName());
273   CPPUNIT_ASSERT_EQUAL(QString("Immersible zone_4_reg"), aRegions(4)->GetName());
274   CPPUNIT_ASSERT_EQUAL(QString("Immersible zone_5_reg"), aRegions(5)->GetName());
275   CPPUNIT_ASSERT_EQUAL(QString("Immersible zone_6_reg"), aRegions(6)->GetName());
276
277   HYDROData_SequenceOfObjects aZonesReg1 = Handle(HYDROData_Region)::DownCast( aRegions(1) )->GetZones();
278   CPPUNIT_ASSERT_EQUAL(3, aZonesReg1.Size());
279   HYDROData_SequenceOfObjects aZonesReg2 = Handle(HYDROData_Region)::DownCast( aRegions(2) )->GetZones();
280   CPPUNIT_ASSERT_EQUAL(2, aZonesReg2.Size());
281   HYDROData_SequenceOfObjects aZonesReg3 = Handle(HYDROData_Region)::DownCast( aRegions(3) )->GetZones();
282   CPPUNIT_ASSERT_EQUAL(3, aZonesReg3.Size());
283   HYDROData_SequenceOfObjects aZonesReg4 = Handle(HYDROData_Region)::DownCast( aRegions(4) )->GetZones();
284   CPPUNIT_ASSERT_EQUAL(11, aZonesReg4.Size());
285   HYDROData_SequenceOfObjects aZonesReg5 = Handle(HYDROData_Region)::DownCast( aRegions(5) )->GetZones();
286   CPPUNIT_ASSERT_EQUAL(6, aZonesReg5.Size());
287   HYDROData_SequenceOfObjects aZonesReg6 = Handle(HYDROData_Region)::DownCast( aRegions(6) )->GetZones();
288   CPPUNIT_ASSERT_EQUAL(5, aZonesReg6.Size());
289
290   {
291     //REG 4; imm.zone4
292     //first priority; shouldn't change the area after complete (surf.mass)
293     double m=0;
294     BRep_Builder B; TopoDS_Compound ccc; B.MakeCompound(ccc);
295     for ( int j = 1; j <= 11; j++ )
296     {
297       Handle(HYDROData_Zone) aZone = Handle(HYDROData_Zone)::DownCast( aZonesReg4(j) );
298       TopoDS_Shape sh = aZone->GetShape();
299       B.Add(ccc, sh);
300       GProp_GProps G;
301       BRepGProp::SurfaceProperties(sh, G);
302       m+=G.Mass();
303     }
304     GProp_GProps G1;
305     Handle(HYDROData_Object) aNewZone1c = Handle(HYDROData_Object)::DownCast( aNewZone1 );
306     BRepGProp::SurfaceProperties(aNewZone1c->GetTopShape(), G1);
307
308     double diff = fabs(G1.Mass()-m); //there is still a difference after calling of general fuse on complicated cases
309     CPPUNIT_ASSERT(diff < 20.0);
310     CPPUNIT_ASSERT_DOUBLES_EQUAL(23387.2, G1.Mass(), 0.1);
311     CPPUNIT_ASSERT_DOUBLES_EQUAL(23370.1, m, 0.1);    
312   }
313   {
314     TopoDS_Shape cmp = GetCalcCaseShape(aCase);
315     TopTools_IndexedMapOfShape M;
316     TopExp::MapShapes(cmp, M);
317     CPPUNIT_ASSERT_EQUAL(197, M.Extent());
318     GProp_GProps G;
319     BRepGProp::SurfaceProperties(cmp, G);
320     CPPUNIT_ASSERT_DOUBLES_EQUAL( 225164.3, G.Mass(), 0.1 );
321     TestViewer::show( cmp, AIS_Shaded, true, "cc_complete_2" );
322     CPPUNIT_ASSERT_IMAGES
323   }
324   aDoc->Close();
325 }
326
327