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_BoundaryPolygons.h>
20 #include <HYDROData_Document.h>
21 #include <HYDROData_CalculationCase.h>
23 #include <BRep_Builder.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>
31 extern QString REF_DATA_PATH;
33 void test_HYDROData_BoundaryPolygons::test_bp_1()
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() ) );
39 Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
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() );
46 CPPUNIT_ASSERT_EQUAL(4, aCase->GetBoundaryPolygons().Size());
47 HYDROData_SequenceOfObjects aSplitGroups = aCase->GetSplitGroups();
48 CPPUNIT_ASSERT_EQUAL(4, aSplitGroups.Size());
50 Handle(HYDROData_ShapesGroup) aGroup1;
51 TopTools_MapOfShape EdgesFromBPGroups;
52 for (int i=1; i<=4;i++)
54 Handle(HYDROData_ShapesGroup) aGroup = Handle(HYDROData_ShapesGroup)::DownCast( aSplitGroups(i) );
55 if (aGroup->GetName() == "Case_1_Immersible zone_1_Outer")
61 TopTools_SequenceOfShape aSeqShapes1;
62 aGroup->GetShapes( aSeqShapes1 );
63 for (int j=1; j<=aSeqShapes1.Size();j++)
65 TopExp_Explorer exp(aSeqShapes1(j), TopAbs_EDGE);
66 for (;exp.More();exp.Next())
67 EdgesFromBPGroups.Add(exp.Current());
71 CPPUNIT_ASSERT( !aGroup1.IsNull() );
73 TopTools_SequenceOfShape aSeqShapes;
74 aGroup1->GetShapes( aSeqShapes );
75 CPPUNIT_ASSERT_EQUAL( 78, aSeqShapes.Size());
77 TopTools_MapOfShape EdgesFromOuter;
79 for (int i=1;i<=aSeqShapes.Size();i++)
80 EdgesFromOuter.Add(aSeqShapes(i));
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);
90 TopTools_IndexedMapOfShape ME, MV;
93 for (int i=1; i<=aSeqShapes.Size();i++)
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();
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);
108 void test_HYDROData_BoundaryPolygons::test_bp_2()
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() ) );
113 Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
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;
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;
131 for (int i=1; i<=aSeqShapes.Size();i++)
133 const TopoDS_Shape& aCSH = aSeqShapes(i);
134 BRepGProp::LinearProperties(aCSH, G);
137 CPPUNIT_ASSERT_DOUBLES_EQUAL( 22.074, len1 , 0.001);
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);
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") );
158 TopTools_SequenceOfShape aSeqShapes;
159 aGroup->GetShapes( aSeqShapes );
160 CPPUNIT_ASSERT_EQUAL( 78, aSeqShapes.Size());
162 TopTools_IndexedMapOfShape ME, MV;
165 for (int i=1; i<=aSeqShapes.Size();i++)
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);
173 CPPUNIT_ASSERT_EQUAL( 78, ME.Extent());
174 CPPUNIT_ASSERT_EQUAL( 78, MV.Extent());
176 CPPUNIT_ASSERT_DOUBLES_EQUAL( 22.074, len2, 0.001);