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.
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.
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
16 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
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>
27 #include <TestViewer.h>
28 #include <TestShape.h>
29 #include <TopTools_ListOfShape.hxx>
30 #include <AIS_DisplayMode.hxx>
33 #include <BRep_Builder.hxx>
34 #include <BRepTools.hxx>
35 #include <HYDROData_CompleteCalcCase.h>
37 #include <HYDROData_Region.h>
39 #include <GProp_GProps.hxx>
40 #include <BRepGProp.hxx>
42 extern QString REF_DATA_PATH;
44 static TopoDS_Shape GetCalcCaseShape(Handle(HYDROData_CalculationCase) theCalcCase)
49 HYDROData_SequenceOfObjects aRegions = theCalcCase->GetRegions();
50 for ( int i = 1; i <= aRegions.Size(); i++ )
52 Handle(HYDROData_Region) aRegion = Handle(HYDROData_Region)::DownCast( aRegions(i) );
53 if ( !aRegion.IsNull() )
55 HYDROData_SequenceOfObjects aZones = aRegion->GetZones();
56 for ( int j = 1; j <= aZones.Size(); j++ )
58 Handle(HYDROData_Zone) aZone = Handle(HYDROData_Zone)::DownCast( aZones(j) );
59 TopoDS_Shape aSh = aZone->GetShape();
67 void test_HYDROData_CalcCase::test_add_int_wires()
71 TopTools_ListOfShape Wires;
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);
80 TopTools_ListOfShape OutSh;
81 TopTools_IndexedDataMapOfShapeShape ls;
82 HYDROData_SplitToZonesTool::CutByEdges(InF, Wires, OutSh, false, &ls, NULL);
84 CPPUNIT_ASSERT_EQUAL(2, OutSh.Extent());
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
95 TopTools_ListOfShape Wires;
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);
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
114 TopTools_ListOfShape Wires;
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);
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
134 void test_HYDROData_CalcCase::test_complete_1()
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() ) );
140 Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
142 Handle(HYDROData_CalculationCase) aCase =
143 Handle(HYDROData_CalculationCase)::DownCast( aDoc->FindObjectByName( "Case_1" ) );
144 CPPUNIT_ASSERT_EQUAL( false, aCase.IsNull() );
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());
152 BRepGProp::SurfaceProperties(cmp, G);
153 CPPUNIT_ASSERT_DOUBLES_EQUAL( 179876.15713670343, G.Mass(), 0.001 );
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);
164 NCollection_Sequence<Handle(HYDROData_Region)> theNewRegions;
165 QSet<QString> newRegionEntries;
166 HYDROData_CompleteCalcCase::AddObjects(aDoc, aCase, theNewObjects, true, is_int, theNewRegions);
169 CPPUNIT_ASSERT_EQUAL(false, is_int);
171 HYDROData_SequenceOfObjects aRegions = aCase->GetRegions();
172 CPPUNIT_ASSERT_EQUAL(4, aRegions.Size());
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());
179 HYDROData_SequenceOfObjects aZonesReg1 = Handle(HYDROData_Region)::DownCast( aRegions(1) )->GetZones();
180 CPPUNIT_ASSERT_EQUAL(3, aZonesReg1.Size());
182 HYDROData_SequenceOfObjects aZonesReg2 = Handle(HYDROData_Region)::DownCast( aRegions(2) )->GetZones();
183 CPPUNIT_ASSERT_EQUAL(1, aZonesReg2.Size());
185 HYDROData_SequenceOfObjects aZonesReg3 = Handle(HYDROData_Region)::DownCast( aRegions(3) )->GetZones();
186 CPPUNIT_ASSERT_EQUAL(3, aZonesReg3.Size());
188 HYDROData_SequenceOfObjects aZonesReg4 = Handle(HYDROData_Region)::DownCast( aRegions(4) )->GetZones();
189 CPPUNIT_ASSERT_EQUAL(5, aZonesReg4.Size());
193 std::set<std::string> aZonesReg1Names;
194 for ( int j = 1; j <= 3; j++ )
196 Handle(HYDROData_Zone) aZone = Handle(HYDROData_Zone)::DownCast( aZonesReg1(j) );
197 aZonesReg1Names.insert( aZone->GetName().toStdString());
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);
207 TopoDS_Shape cmp = GetCalcCaseShape(aCase);
208 TopTools_IndexedMapOfShape M;
209 TopExp::MapShapes(cmp, M);
210 CPPUNIT_ASSERT_EQUAL(72, M.Extent());
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
221 void test_HYDROData_CalcCase::test_complete_2()
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() ) );
227 Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
229 Handle(HYDROData_CalculationCase) aCase =
230 Handle(HYDROData_CalculationCase)::DownCast( aDoc->FindObjectByName( "Case_1" ) );
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" );
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);
260 NCollection_Sequence<Handle(HYDROData_Region)> theNewRegions;
261 QSet<QString> newRegionEntries;
262 HYDROData_CompleteCalcCase::AddObjects(aDoc, aCase, theNewObjects, true, is_int, theNewRegions);
265 CPPUNIT_ASSERT_EQUAL(true, is_int);
267 HYDROData_SequenceOfObjects aRegions = aCase->GetRegions();
268 CPPUNIT_ASSERT_EQUAL(6, aRegions.Size());
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());
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());
292 //first priority; shouldn't change the area after complete (surf.mass)
294 BRep_Builder B; TopoDS_Compound ccc; B.MakeCompound(ccc);
295 for ( int j = 1; j <= 11; j++ )
297 Handle(HYDROData_Zone) aZone = Handle(HYDROData_Zone)::DownCast( aZonesReg4(j) );
298 TopoDS_Shape sh = aZone->GetShape();
301 BRepGProp::SurfaceProperties(sh, G);
305 Handle(HYDROData_Object) aNewZone1c = Handle(HYDROData_Object)::DownCast( aNewZone1 );
306 BRepGProp::SurfaceProperties(aNewZone1c->GetTopShape(), G1);
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);
314 TopoDS_Shape cmp = GetCalcCaseShape(aCase);
315 TopTools_IndexedMapOfShape M;
316 TopExp::MapShapes(cmp, M);
317 CPPUNIT_ASSERT_EQUAL(197, M.Extent());
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