Salome HOME
Merge branch 'BR_H2018_4' into BR_PY3
[modules/hydro.git] / src / HYDRO_tests / test_HYDROData_PolylineXY.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_PolylineXY.h>
20
21 #include <HYDROData_Channel.h>
22 #include <HYDROData_Document.h>
23 #include <HYDROData_PolylineXY.h>
24 #include <HYDROData_Polyline3D.h>
25 #include <HYDROData_PolylineOperator.h>
26 #include <HYDROData_Profile.h>
27 #include <HYDROData_Iterator.h>
28 #include <HYDROData_ImmersibleZone.h>
29 #include <HYDROData_Tool.h>
30 #include <HYDROGUI_Shape.h>
31 #include <HYDROGUI_Polyline.h>
32 #include <HYDROData_SinusX.h>
33 #include <BRep_Builder.hxx>
34
35 #include <AIS_DisplayMode.hxx>
36 #include <AIS_PointCloud.hxx>
37 #include <Prs3d_LineAspect.hxx>
38 #include <Prs3d_PointAspect.hxx>
39 #include <TColgp_HArray1OfPnt.hxx>
40 #include <QColor>
41 #include <QList>
42 #include <QPointF>
43 #include <QTest>
44
45 #include <TestShape.h>
46 #include <TestViewer.h>
47 #include <TopoDS_Edge.hxx>
48 #include <TopoDS_Vertex.hxx>
49 #include <TopoDS_Wire.hxx>
50 #include <gp_XY.hxx>
51 #include <HYDROData_Tool.h>
52
53 extern QString REF_DATA_PATH;
54
55 void test_HYDROData_PolylineXY::test_polyline()
56 {
57   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
58
59   Handle(HYDROData_PolylineXY) aPolyline = 
60     Handle(HYDROData_PolylineXY)::DownCast(aDoc->CreateObject(KIND_POLYLINEXY));
61
62   aPolyline->AddSection( "Section_1", HYDROData_PolylineXY::SECTION_POLYLINE, false );
63   aPolyline->AddSection( "Section_2", HYDROData_PolylineXY::SECTION_SPLINE, true );
64
65   int aNbSections = aPolyline->NbSections();
66   CPPUNIT_ASSERT( aNbSections == 2 );
67   
68   NCollection_Sequence<TCollection_AsciiString>           aSectNames;
69   NCollection_Sequence<HYDROData_PolylineXY::SectionType> aSectTypes;
70   NCollection_Sequence<bool>                              aSectClosures;
71   aPolyline->GetSections( aSectNames, aSectTypes, aSectClosures );
72
73   CPPUNIT_ASSERT_EQUAL( 2, aSectNames.Size() );
74   CPPUNIT_ASSERT( aSectNames.Value( 1 ) == "Section_1" );
75   CPPUNIT_ASSERT( aSectTypes.Value( 1 ) == HYDROData_PolylineXY::SECTION_POLYLINE );
76   CPPUNIT_ASSERT( aSectClosures.Value( 1 ) == false );
77
78   CPPUNIT_ASSERT( aSectNames.Value( 2 ) == "Section_2" );
79   CPPUNIT_ASSERT( aSectTypes.Value( 2 ) == HYDROData_PolylineXY::SECTION_SPLINE );
80   CPPUNIT_ASSERT( aSectClosures.Value( 2 ) == true );
81
82   aDoc->Close();
83 }
84
85 void test_HYDROData_PolylineXY::test_copy()
86 {
87   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
88   Handle(HYDROData_PolylineXY) aPolyline1 = 
89     Handle(HYDROData_PolylineXY)::DownCast(aDoc->CreateObject(KIND_POLYLINEXY));
90
91
92 //  aPolyline1->setPoints(aPoints);
93
94   Handle(HYDROData_PolylineXY) aPolyline2 = 
95     Handle(HYDROData_PolylineXY)::DownCast(aDoc->CreateObject(KIND_POLYLINEXY));
96
97   aPolyline1->CopyTo(aPolyline2, true);
98
99
100   aDoc->Close();
101 }
102
103 void test_HYDROData_PolylineXY::test_split_refs_624()
104 {
105   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
106
107   Handle(HYDROData_PolylineXY) aPolyline = 
108     Handle(HYDROData_PolylineXY)::DownCast( aDoc->CreateObject( KIND_POLYLINEXY ) );
109   aPolyline->SetName( "test" );
110
111   QList<double> aCoords = QList<double>() << 10 << 10 << 20 << 10 << 20 << 20 << 10 << 20;
112   TopoDS_Wire aWire = Wire2d( aCoords, true );
113   aPolyline->SetShape( aWire );
114
115   gp_Pnt2d aPnt( 20, 20 );
116
117   TestViewer::show( aPolyline->GetShape(), 0, true, "LandCoverMap_Split_Polyline" );
118   //TestViewer::show( BRepBuilderAPI_MakeVertex( aPnt ).Vertex(), 1, true, Qt::green );
119   CPPUNIT_ASSERT_IMAGES
120
121   HYDROData_PolylineOperator anOp;
122   CPPUNIT_ASSERT_EQUAL( true, anOp.Split( aDoc, aPolyline, aPnt, 1E-3 ) );
123
124   HYDROData_Iterator anIt( aDoc, KIND_POLYLINEXY );
125   CPPUNIT_ASSERT_EQUAL( true, anIt.More() );
126   CPPUNIT_ASSERT_EQUAL( QString( "test" ), anIt.Current()->GetName() );
127   anIt.Next();
128   CPPUNIT_ASSERT_EQUAL( true, anIt.More() );
129   CPPUNIT_ASSERT_EQUAL( QString( "test_1" ), anIt.Current()->GetName() );
130   anIt.Next();
131   CPPUNIT_ASSERT_EQUAL( false, anIt.More() );
132
133   aDoc->Close();
134 }
135
136 void test_HYDROData_PolylineXY::test_extraction_immersible_zone()
137 {
138   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
139
140   Handle(HYDROData_PolylineXY) aPolyline = 
141     Handle(HYDROData_PolylineXY)::DownCast( aDoc->CreateObject( KIND_POLYLINEXY ) );
142   aPolyline->SetName( "test" );
143
144   QList<double> aCoords = QList<double>() << 10 << 10 << 20 << 10 << 20 << 20 << 10 << 20;
145   TopoDS_Wire aWire = Wire2d( aCoords, true );
146   aPolyline->SetShape( aWire );
147
148   Handle(HYDROData_ImmersibleZone) aZone = 
149     Handle(HYDROData_ImmersibleZone)::DownCast( aDoc->CreateObject( KIND_IMMERSIBLE_ZONE ) );
150   aZone->SetName( "zone" );
151   aZone->SetPolyline( aPolyline );
152   aZone->Update();
153
154   CPPUNIT_ASSERT_EQUAL( false, (bool)aZone->GetTopShape().IsNull() );
155
156   HYDROData_PolylineOperator anOp;
157   CPPUNIT_ASSERT_EQUAL( true, anOp.Extract( aDoc, aZone ) );
158
159   Handle(HYDROData_PolylineXY) anOuter = 
160     Handle(HYDROData_PolylineXY)::DownCast( aDoc->FindObjectByName( "zone_Outer_1", KIND_POLYLINEXY ) );
161   CPPUNIT_ASSERT_EQUAL( false, (bool)anOuter.IsNull() );
162
163   TestViewer::show( aZone->GetTopShape(), 1, true, "Extraction_ImmZone" );
164   TestViewer::show( anOuter->GetShape(), 0, true, Qt::red );
165   CPPUNIT_ASSERT_IMAGES
166
167   aDoc->Close();
168 }
169
170 void test_HYDROData_PolylineXY::test_extraction_channel_refs_611()
171 {
172   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
173
174   Handle(HYDROData_PolylineXY) aPolyline2d = 
175     Handle(HYDROData_PolylineXY)::DownCast( aDoc->CreateObject( KIND_POLYLINEXY ) );
176   aPolyline2d->SetName( "polyline2d_1" );
177   aPolyline2d->AddSection( "", HYDROData_IPolyline::SECTION_SPLINE, false );
178
179   Handle(HYDROData_Polyline3D) aPolyline3d = 
180     Handle(HYDROData_Polyline3D)::DownCast( aDoc->CreateObject( KIND_POLYLINE ) );
181   aPolyline3d->SetName( "polyline3d_1" );
182   aPolyline3d->SetPolylineXY( aPolyline2d );
183
184   QList<double> aCoords = QList<double>() << 10 << 10 << 20 << 10 << 20 << 20 << 10 << 20;
185   TopoDS_Wire aWire = Wire2d( aCoords, false );
186   aPolyline2d->SetShape( aWire );
187   aPolyline3d->SetTopShape( aWire );
188   aPolyline3d->SetShape3D( aWire );
189
190   Handle(HYDROData_Profile) aProfile = 
191     Handle(HYDROData_Profile)::DownCast( aDoc->CreateObject( KIND_PROFILE ) );
192   aProfile->SetName( "profile_1" );
193
194   QList<double> aCoordsPr = QList<double>() << 0.0 << 0.1 << 0.0 << 0.0 << 1.0 << 0.0;
195   TopoDS_Wire aWirePr = Wire3d( aCoordsPr, false );
196   aProfile->SetTopShape( aWirePr );
197   aProfile->SetShape3D( aWirePr );
198
199
200   Handle(HYDROData_Channel) aChannel = 
201     Handle(HYDROData_Channel)::DownCast( aDoc->CreateObject( KIND_CHANNEL ) );
202   aChannel->SetName( "channel_1" );
203   
204   aChannel->SetGuideLine( aPolyline3d );
205   aChannel->SetProfile( aProfile );
206   aChannel->Update();
207   CPPUNIT_ASSERT_EQUAL( false, (bool)aChannel->GetTopShape().IsNull() );
208   CPPUNIT_ASSERT_EQUAL( false, (bool)aChannel->GetShape3D().IsNull() );
209
210   HYDROData_PolylineOperator anOp;
211   CPPUNIT_ASSERT_EQUAL( true, anOp.Extract( aDoc, aChannel ) );
212
213   Handle(HYDROData_PolylineXY) aLeft = 
214     Handle(HYDROData_PolylineXY)::DownCast( aDoc->FindObjectByName( "channel_1_Left_Bank_1", KIND_POLYLINEXY ) );
215   Handle(HYDROData_PolylineXY) aRight = 
216     Handle(HYDROData_PolylineXY)::DownCast( aDoc->FindObjectByName( "channel_1_Right_Bank_1", KIND_POLYLINEXY ) );
217   CPPUNIT_ASSERT_EQUAL( false, (bool)aRight.IsNull() );
218
219   TestViewer::show( aChannel->GetTopShape(), 1, true, "Extraction_Channel" );
220   TestViewer::show( aLeft->GetShape(), 0, true, Qt::red );
221   TestViewer::show( aRight->GetShape(), 0, true, Qt::red );
222   CPPUNIT_ASSERT_IMAGES
223
224   aDoc->Close();
225 }
226
227 void test_HYDROData_PolylineXY::test_presentation()
228 {
229   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
230
231   Handle(HYDROData_PolylineXY) aPolyline2d = 
232     Handle(HYDROData_PolylineXY)::DownCast( aDoc->CreateObject( KIND_POLYLINEXY ) );
233   aPolyline2d->SetName( "polyline2d_1" );
234   aPolyline2d->AddSection( "", HYDROData_IPolyline::SECTION_SPLINE, false );
235
236   QList<gp_XY> aPoints = QList<gp_XY>() << gp_XY(  0,  0 )
237                                         << gp_XY( 10, 10 )
238                                         << gp_XY( 20, 40 )
239                                         << gp_XY( 30, 10 )
240                                         << gp_XY( 40, 50 )
241                                         << gp_XY( 50, 60 )
242                                         << gp_XY( -10, 40 )
243                                         << gp_XY( -9, 39 )
244                                         << gp_XY( -8, 38 )
245                                         << gp_XY(  0, 20 );
246   Handle(TColgp_HArray1OfPnt) aPnts = new TColgp_HArray1OfPnt( 1, aPoints.size() );
247   int i = 1;
248   foreach( gp_XY aPoint, aPoints )
249   {
250     aPolyline2d->AddPoint( 0, aPoint );
251     aPnts->SetValue( i, gp_Pnt( aPoint.X(), aPoint.Y(), 0 ) );
252     i++;
253   }
254   aPolyline2d->Update();
255
256   CPPUNIT_ASSERT_EQUAL( false, (bool)aPolyline2d->GetShape().IsNull() );
257
258   Handle(AIS_PointCloud) aPointsPrs = new AIS_PointCloud();
259   aPointsPrs->SetPoints( aPnts );
260   aPointsPrs->SetColor( Quantity_NOC_BLUE1 );
261   aPointsPrs->Attributes()->PointAspect()->SetTypeOfMarker( Aspect_TOM_O );
262
263   aPolyline2d->SetWireColor( Qt::darkGreen );
264   HYDROGUI_Shape* aNewPolylinePrs = new HYDROGUI_Shape( TestViewer::context(), aPolyline2d );
265   aNewPolylinePrs->update( true, true );
266
267
268   // Check default type
269   Handle(HYDROGUI_Arrow) arr = Handle(HYDROGUI_Arrow)::DownCast( aNewPolylinePrs->getAISObjects()[1] );
270   CPPUNIT_ASSERT_EQUAL( HYDROGUI_Arrow::Cone, arr->GetType() );
271   CPPUNIT_ASSERT_EQUAL( 35, arr->GetSize() );
272
273   
274   // Check polyline presentation with default (cone) arrow
275   TestViewer::eraseAll(true);
276   TestViewer::show( aPointsPrs, AIS_PointCloud::DM_Points, 0, true, "Polyline_Presentation" );
277   TestViewer::show( aPolyline2d->GetShape(), 0, true, Qt::red );
278   //TestViewer::show( aNewPolylinePrs, AIS_PointCloud::DM_Points, 0, true, "" );
279   aNewPolylinePrs->setBorderColor( Qt::blue );
280   aNewPolylinePrs->display();
281   TestViewer::fitAll();
282   CPPUNIT_ASSERT_IMAGES
283
284
285   // Check polyline presentation with triangle arrow
286   arr->SetType( HYDROGUI_Arrow::Triangle );
287   TestViewer::eraseAll(true);
288   TestViewer::show( aPointsPrs, AIS_PointCloud::DM_Points, 0, true, "Polyline_Presentation_triangle" );
289   TestViewer::show( aPolyline2d->GetShape(), 0, true, Qt::red );
290   //TestViewer::show( aNewPolylinePrs, AIS_PointCloud::DM_Points, 0, true, "" );
291   TestViewer::context()->RecomputePrsOnly( arr, true );
292   aNewPolylinePrs->display();
293   TestViewer::fitAll();
294   CPPUNIT_ASSERT_IMAGES
295
296   //QTest::qWait( 50000 );  
297   aDoc->Close();
298 }
299
300 void test_HYDROData_PolylineXY::test_split_refs_627()
301 {
302   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
303
304   Handle(HYDROData_PolylineXY) aPolyline = 
305     Handle(HYDROData_PolylineXY)::DownCast( aDoc->CreateObject( KIND_POLYLINEXY ) );
306   aPolyline->SetName( "test" );
307
308
309   //QList<double> aCoords = QList<double>() << 10 << 10 << 20 << 10 << 20 << 20 << 10 << 20;
310   aPolyline->AddSection( "", HYDROData_PolylineXY::SECTION_POLYLINE, false );
311   aPolyline->AddPoint( 0, gp_XY( 10, 10  ) );
312   aPolyline->AddPoint( 0, gp_XY( 20, 10 ) );
313   aPolyline->AddPoint( 0, gp_XY( 20, 20 ) );
314   aPolyline->AddPoint( 0, gp_XY( 10, 20 ) );
315   aPolyline->Update();
316
317
318   //TopoDS_Wire aWire = Wire2d( aCoords, false );
319   //aPolyline->SetShape( aWire );
320   TopoDS_Shape aW = aPolyline->GetShape();
321   CPPUNIT_ASSERT (aW.ShapeType() == TopAbs_WIRE);
322
323   aPolyline->SetWireColor( Qt::red );
324
325   gp_Pnt2d aPnt( 20, 20 );
326   
327   HYDROData_PolylineOperator anOp;
328   CPPUNIT_ASSERT_EQUAL( true, anOp.Split( aDoc, aPolyline, aPnt, 1E-3 ) );
329
330   TestViewer::show( TopoDS_Shape(), 0, true, "Split_Polylines_Colors" );
331   HYDROData_Iterator anIt( aDoc, KIND_POLYLINEXY );
332   for( ; anIt.More(); anIt.Next() )
333   {
334     Handle(HYDROData_PolylineXY) anObj = Handle(HYDROData_PolylineXY)::DownCast( anIt.Current() );
335     if( aPolyline->Label() != anObj->Label() )
336     {
337       QColor color;
338       anObj->GetSectionColor(0, color);
339       TestViewer::show( anObj->GetShape(), 0, true, color );
340     }
341   }
342   CPPUNIT_ASSERT_IMAGES
343     
344   HYDROData_Iterator anIt2( aDoc, KIND_POLYLINEXY );
345   CPPUNIT_ASSERT_EQUAL( true, anIt2.More() );
346   CPPUNIT_ASSERT_EQUAL( QString( "test" ), anIt2.Current()->GetName() );
347
348   QColor color1, color2, color3;
349   Handle(HYDROData_PolylineXY)::DownCast( anIt2.Current() )->GetSectionColor(0, color1);
350
351   CPPUNIT_ASSERT_EQUAL( QColor( Qt::red ), color1);
352   anIt2.Next();
353   CPPUNIT_ASSERT_EQUAL( true, anIt2.More() );
354   CPPUNIT_ASSERT_EQUAL( QString( "test_1" ), anIt2.Current()->GetName() );
355
356   Handle(HYDROData_PolylineXY)::DownCast( anIt2.Current() )->GetSectionColor(0, color2);
357   CPPUNIT_ASSERT_EQUAL( QColor( Qt::red ), color2 );
358
359   anIt2.Next();
360   CPPUNIT_ASSERT_EQUAL( true, anIt2.More() );
361   CPPUNIT_ASSERT_EQUAL( QString( "test_2" ), anIt2.Current()->GetName() );
362   Handle(HYDROData_PolylineXY)::DownCast( anIt2.Current() )->GetSectionColor(0, color3);
363   CPPUNIT_ASSERT_EQUAL( QColor( Qt::red ), color3 );
364   anIt2.Next();
365   CPPUNIT_ASSERT_EQUAL( false, anIt2.More() );
366   anIt2.Next();
367
368   aDoc->Close();
369 }
370
371 void test_HYDROData_PolylineXY::test_custom_polylines()
372 {
373   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
374
375   Handle(HYDROData_PolylineXY) aPolyline1 = 
376     Handle(HYDROData_PolylineXY)::DownCast( aDoc->CreateObject( KIND_POLYLINEXY ) );
377   Handle(HYDROData_PolylineXY) aPolyline2 = 
378     Handle(HYDROData_PolylineXY)::DownCast( aDoc->CreateObject( KIND_POLYLINEXY ) );
379   Handle(HYDROData_PolylineXY) aPolyline3 = 
380     Handle(HYDROData_PolylineXY)::DownCast( aDoc->CreateObject( KIND_POLYLINEXY ) );
381
382   aPolyline1->SetName( "test1" );
383   aPolyline2->SetName( "test2" );
384   aPolyline3->SetName( "test3" );
385
386   CPPUNIT_ASSERT_EQUAL( false, aPolyline1->IsCustom() );
387   aPolyline1->AddSection( "", HYDROData_IPolyline::SECTION_SPLINE, false );
388   aPolyline1->Update();
389   CPPUNIT_ASSERT_EQUAL( false, aPolyline1->IsCustom() );
390   aPolyline1->AddPoint( 0, gp_XY( 0, 0 ) );
391   aPolyline1->Update();
392   CPPUNIT_ASSERT_EQUAL( false, aPolyline1->IsCustom() );
393
394   CPPUNIT_ASSERT_EQUAL( false, aPolyline2->IsCustom() );
395   aPolyline2->SetShape( Wire2d( QList<double>() << 0 << 0 << 10 << 10 << 20 << 0 ) );
396   CPPUNIT_ASSERT_EQUAL( true, aPolyline2->IsCustom() );
397   HYDROData_PolylineXY::PointsList aPointsList = aPolyline2->GetPoints( 0 );
398
399   CPPUNIT_ASSERT_EQUAL( false, aPolyline2->IsCustom() );
400   CPPUNIT_ASSERT_EQUAL( 5, aPointsList.Size() );
401   CPPUNIT_ASSERT_EQUAL( gp_XY( 0, 0 ), aPointsList.Value( 1 ) );
402   CPPUNIT_ASSERT_EQUAL( gp_XY( 5, 7.5 ), aPointsList.Value( 2 ) );
403   CPPUNIT_ASSERT_EQUAL( gp_XY( 10, 10 ), aPointsList.Value( 3 ) );
404   CPPUNIT_ASSERT_EQUAL( gp_XY( 15, 7.5 ), aPointsList.Value( 4 ) );
405   CPPUNIT_ASSERT_EQUAL( gp_XY( 20, 0 ), aPointsList.Value( 5 ) );
406
407
408   CPPUNIT_ASSERT_EQUAL( false, aPolyline3->IsCustom() );
409   aPolyline3->SetShape( WireCirc( gp_Pnt(), 10.0 ) );
410   CPPUNIT_ASSERT_EQUAL( true, aPolyline3->IsCustom() );
411   aPointsList = aPolyline3->GetPoints( 0 );
412
413   CPPUNIT_ASSERT_EQUAL( HYDROData_PolylineXY::SECTION_SPLINE, aPolyline3->GetSectionType( 0 ) );
414   CPPUNIT_ASSERT_EQUAL( true, aPolyline3->IsClosedSection( 0 ) );
415   CPPUNIT_ASSERT_EQUAL( 7, aPointsList.Size() );
416   CPPUNIT_ASSERT_EQUAL( gp_XY( 10, 0 ), aPointsList.Value( 1 ) );
417   CPPUNIT_ASSERT_EQUAL( gp_XY( 6.2349, 7.81831 ), aPointsList.Value( 2 ) );
418   CPPUNIT_ASSERT_EQUAL( gp_XY( -2.225, 9.749 ), aPointsList.Value( 3 ) );
419   CPPUNIT_ASSERT_EQUAL( gp_XY( -9.01, 4.339 ), aPointsList.Value( 4 ) );
420   CPPUNIT_ASSERT_EQUAL( gp_XY( -9.01, -4.339 ), aPointsList.Value( 5 ) );
421   CPPUNIT_ASSERT_EQUAL( gp_XY( -2.225, -9.749 ), aPointsList.Value( 6 ) );
422   CPPUNIT_ASSERT_EQUAL( gp_XY( 6.2349, -7.81831 ), aPointsList.Value( 7 ) );
423
424   aDoc->Close();
425 }
426
427 void test_HYDROData_PolylineXY::test_merge_refs_630()
428 {
429   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
430
431   Handle(HYDROData_PolylineXY) aPolyline1 = 
432     Handle(HYDROData_PolylineXY)::DownCast( aDoc->CreateObject( KIND_POLYLINEXY ) );
433   Handle(HYDROData_PolylineXY) aPolyline2 = 
434     Handle(HYDROData_PolylineXY)::DownCast( aDoc->CreateObject( KIND_POLYLINEXY ) );
435
436   aPolyline1->SetName( "test1" );
437   aPolyline1->AddSection( "", HYDROData_PolylineXY::SECTION_SPLINE, false );
438   aPolyline1->AddPoint( 0, gp_XY( 0, 0 ) );
439   aPolyline1->AddPoint( 0, gp_XY( 10, 0 ) );
440   aPolyline1->AddPoint( 0, gp_XY( 10, 10 ) );
441   aPolyline1->Update();
442
443   aPolyline2->SetName( "test2" );
444   aPolyline2->AddSection( "", HYDROData_PolylineXY::SECTION_SPLINE, false );
445   aPolyline2->AddPoint( 0, gp_XY( 20, 20 ) );
446   aPolyline2->AddPoint( 0, gp_XY( 30, 20 ) );
447   aPolyline2->AddPoint( 0, gp_XY( 30, 0 ) );
448   aPolyline2->Update();
449
450   HYDROData_PolylineOperator anOp;
451   HYDROData_SequenceOfObjects aPolylines;
452   aPolylines.Append( aPolyline1 );
453   aPolylines.Append( aPolyline2 );
454   CPPUNIT_ASSERT_EQUAL( true, anOp.Merge( aDoc, "", aPolylines, true, 1E-3 ) );
455   //TODO: check false in merge
456
457   HYDROData_Iterator anIt( aDoc, KIND_POLYLINEXY );
458   CPPUNIT_ASSERT_EQUAL( true, anIt.More() );
459   CPPUNIT_ASSERT_EQUAL( QString( "test1" ), anIt.Current()->GetName() );
460   anIt.Next();
461   CPPUNIT_ASSERT_EQUAL( true, anIt.More() );
462   CPPUNIT_ASSERT_EQUAL( QString( "test2" ), anIt.Current()->GetName() );
463   anIt.Next();
464   CPPUNIT_ASSERT_EQUAL( true, anIt.More() );
465   CPPUNIT_ASSERT_EQUAL( QString( "merged_1" ), anIt.Current()->GetName() );
466   Handle(HYDROData_PolylineXY) aMerged = 
467     Handle(HYDROData_PolylineXY)::DownCast( anIt.Current() );
468   anIt.Next();
469   CPPUNIT_ASSERT_EQUAL( false, anIt.More() );
470
471   TestViewer::show( aMerged->GetShape(), 0, true, "Merge_Polylines" );
472   CPPUNIT_ASSERT_IMAGES
473
474   aDoc->Close();
475 }
476
477 void test_HYDROData_PolylineXY::test_split_straight_refs_634()
478 {
479   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
480
481   Handle(HYDROData_PolylineXY) aPolyline1 = 
482     Handle(HYDROData_PolylineXY)::DownCast( aDoc->CreateObject( KIND_POLYLINEXY ) );
483   Handle(HYDROData_PolylineXY) aPolyline2 = 
484     Handle(HYDROData_PolylineXY)::DownCast( aDoc->CreateObject( KIND_POLYLINEXY ) );
485
486   aPolyline1->SetName( "test1" );
487   aPolyline1->AddSection( "", HYDROData_PolylineXY::SECTION_POLYLINE, false );
488   aPolyline1->AddPoint( 0, gp_XY( 0, 0 ) );
489   aPolyline1->AddPoint( 0, gp_XY( 10, 20 ) );
490   aPolyline1->AddPoint( 0, gp_XY( 30, 10 ) );
491   aPolyline1->Update();
492
493   aPolyline2->SetName( "test2" );
494   aPolyline2->AddSection( "", HYDROData_PolylineXY::SECTION_SPLINE, false );
495   aPolyline2->AddPoint( 0, gp_XY( 0, 30 ) );
496   aPolyline2->AddPoint( 0, gp_XY( 10, 10 ) );
497   aPolyline2->AddPoint( 0, gp_XY( 30, 20 ) );
498   aPolyline2->Update();
499
500   HYDROData_PolylineOperator anOp;
501   HYDROData_SequenceOfObjects aPolylines;
502   aPolylines.Append( aPolyline1 );
503   aPolylines.Append( aPolyline2 );
504   bool isIntersected;
505   CPPUNIT_ASSERT_EQUAL( true, anOp.Split( aDoc, aPolyline1, aPolyline2, 1E-3, isIntersected ) );
506   CPPUNIT_ASSERT_EQUAL( true, isIntersected );
507
508   HYDROData_Iterator anIt( aDoc, KIND_POLYLINEXY );
509   CPPUNIT_ASSERT_EQUAL( true, anIt.More() );
510   CPPUNIT_ASSERT_EQUAL( QString( "test1" ), anIt.Current()->GetName() );
511   anIt.Next();
512   CPPUNIT_ASSERT_EQUAL( true, anIt.More() );
513   CPPUNIT_ASSERT_EQUAL( QString( "test2" ), anIt.Current()->GetName() );
514   anIt.Next();
515
516   CPPUNIT_ASSERT_EQUAL( true, anIt.More() );
517   CPPUNIT_ASSERT_EQUAL( QString( "test1_1" ), anIt.Current()->GetName() );
518   Handle(HYDROData_PolylineXY) aPart1 = 
519     Handle(HYDROData_PolylineXY)::DownCast( anIt.Current() );
520   CPPUNIT_ASSERT_EQUAL( HYDROData_PolylineXY::SECTION_POLYLINE, aPart1->GetSectionType( 0 ) );
521   anIt.Next();
522
523   CPPUNIT_ASSERT_EQUAL( true, anIt.More() );
524   CPPUNIT_ASSERT_EQUAL( QString( "test1_2" ), anIt.Current()->GetName() );
525   Handle(HYDROData_PolylineXY) aPart2 = 
526     Handle(HYDROData_PolylineXY)::DownCast( anIt.Current() );
527   CPPUNIT_ASSERT_EQUAL( HYDROData_PolylineXY::SECTION_POLYLINE, aPart2->GetSectionType( 0 ) );
528   anIt.Next();
529
530   CPPUNIT_ASSERT_EQUAL( true, anIt.More() );
531   CPPUNIT_ASSERT_EQUAL( QString( "test1_3" ), anIt.Current()->GetName() );
532   Handle(HYDROData_PolylineXY) aPart3 = 
533     Handle(HYDROData_PolylineXY)::DownCast( anIt.Current() );
534   CPPUNIT_ASSERT_EQUAL( HYDROData_PolylineXY::SECTION_POLYLINE, aPart3->GetSectionType( 0 ) );
535   anIt.Next();
536
537   CPPUNIT_ASSERT_EQUAL( false, anIt.More() );
538
539   TestViewer::show( aPart1->GetShape(), 0, true, "Split_Straight" );
540   TestViewer::show( aPart2->GetShape(), 0, true, Qt::red );
541   TestViewer::show( aPart3->GetShape(), 0, true, Qt::green );
542   TestViewer::show( aPolyline2->GetShape(), 0, true, Qt::darkGreen );
543   CPPUNIT_ASSERT_IMAGES
544
545   aDoc->Close();
546 }
547
548 void test_HYDROData_PolylineXY::test_import_from_xyz()
549 {
550   NCollection_Sequence<Handle(HYDROData_Entity)> ents;
551   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
552   TCollection_AsciiString fname = REF_DATA_PATH.toLatin1().data();
553   fname += "/profiles1.xyz";
554
555   NCollection_Sequence<Handle(HYDROData_Entity)> importedEntities;
556   bool stat = HYDROData_Tool::importPolylineFromXYZ(QString(fname.ToCString()), aDoc, true, importedEntities);
557   CPPUNIT_ASSERT (stat);
558   Handle(HYDROData_PolylineXY) aPolyXY = Handle(HYDROData_PolylineXY)::DownCast(importedEntities.First());   
559   CPPUNIT_ASSERT_EQUAL (importedEntities.Size(), 1);
560   CPPUNIT_ASSERT (!aPolyXY.IsNull());
561   TestViewer::show( aPolyXY->GetShape(), 0, true, "Polyline_import_XY" );
562   CPPUNIT_ASSERT_IMAGES
563   importedEntities.Clear();
564
565   stat = HYDROData_Tool::importPolylineFromXYZ(QString(fname.ToCString()), aDoc, false, importedEntities);
566   CPPUNIT_ASSERT (stat);
567   CPPUNIT_ASSERT_EQUAL (importedEntities.Size(), 2);
568   Handle(HYDROData_Polyline3D) aPoly3D;
569   aPolyXY = Handle(HYDROData_PolylineXY)::DownCast(importedEntities.First());   
570   aPoly3D = Handle(HYDROData_Polyline3D)::DownCast(importedEntities.Last());
571   CPPUNIT_ASSERT (!aPolyXY.IsNull());
572   CPPUNIT_ASSERT (!aPoly3D.IsNull());
573   TestViewer::show( aPolyXY->GetShape(), 0, false, "Polyline_import_XYZ" );
574   TestViewer::show( aPoly3D->GetShape3D(), 0, false, "Polyline_import_XYZ_3D" );
575   CPPUNIT_ASSERT_IMAGES
576 }
577
578
579 void test_HYDROData_PolylineXY::test_import_from_sx()
580 {
581   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document();
582   TCollection_AsciiString fname = REF_DATA_PATH.toLatin1().data();
583   fname += "/polylines_sx.sx";
584
585   HYDROData_SinusX aSinusXImporter;
586   NCollection_Sequence<Handle(HYDROData_Entity)> importedEntities;
587   //bool stat = aSinusXImporter.Import(QString(fname.ToCString()), aDoc, importedEntities);
588   bool ParseStat = aSinusXImporter.OpenAndParse(QString(fname.ToCString()));
589   CPPUNIT_ASSERT (ParseStat);
590   aSinusXImporter.Import(aDoc, importedEntities, NULL);
591   CPPUNIT_ASSERT_EQUAL (importedEntities.Size(), 9);
592
593   Handle(HYDROData_PolylineXY) aPolyXY1 = Handle(HYDROData_PolylineXY)::DownCast(importedEntities(1));   
594   Handle(HYDROData_PolylineXY) aPolyXY2 = Handle(HYDROData_PolylineXY)::DownCast(importedEntities(4));  
595   Handle(HYDROData_PolylineXY) aPolyXY3 = Handle(HYDROData_PolylineXY)::DownCast(importedEntities(7));   
596
597   CPPUNIT_ASSERT (!aPolyXY1.IsNull());
598   CPPUNIT_ASSERT (!aPolyXY2.IsNull());
599   CPPUNIT_ASSERT (!aPolyXY3.IsNull());
600
601   aPolyXY1->Update();
602   aPolyXY2->Update();
603   aPolyXY3->Update();
604
605   CPPUNIT_ASSERT_EQUAL (aPolyXY1->GetName(), QString("AXIS"));
606   CPPUNIT_ASSERT_EQUAL (aPolyXY2->GetName(), QString("LB"));
607   CPPUNIT_ASSERT_EQUAL (aPolyXY3->GetName(), QString("RB"));
608
609   TopoDS_Shape sh1 = aPolyXY1->GetShape();
610   TopoDS_Shape sh2 = aPolyXY2->GetShape();
611   TopoDS_Shape sh3 = aPolyXY3->GetShape();
612   CPPUNIT_ASSERT (!sh1.IsNull());
613   CPPUNIT_ASSERT (!sh2.IsNull());
614   CPPUNIT_ASSERT (!sh3.IsNull());
615
616   BRep_Builder BB;
617   TopoDS_Compound cmp;
618   BB.MakeCompound(cmp);
619   BB.Add(cmp, sh1);
620   BB.Add(cmp, sh2);
621   BB.Add(cmp, sh3);
622
623   TestViewer::show( cmp, 0, true, "Polylines_import_SX" );
624   CPPUNIT_ASSERT_IMAGES
625 }
626
627 void test_HYDROData_PolylineXY::test_import_from_sx_options()
628 {
629   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( 1 );
630   TCollection_AsciiString fname = REF_DATA_PATH.toLatin1().data();
631   fname += "/trait_cote_lambert1N.sx";
632
633   HYDROData_SinusX aSinusXImporter;
634   NCollection_Sequence<Handle(HYDROData_Entity)> importedEntities;
635   //bool stat = aSinusXImporter.Import(QString(fname.ToCString()), aDoc, importedEntities);
636   bool ParseStat = aSinusXImporter.OpenAndParse(QString(fname.ToCString()));
637   CPPUNIT_ASSERT (ParseStat);
638
639   std::vector<HYDROData_SinusX::ImportOptions> options; 
640   int size = aSinusXImporter.GetCurveBlocks().size();
641   CPPUNIT_ASSERT_EQUAL(33, size);
642   for (int i = 0; i < 33; i++)
643   {
644     HYDROData_SinusX::ImportOptions option;
645     option.ImportAsBathy = false;
646     if (i>12)
647     {
648       option.ImportAsPolyXY = true;
649       option.ImportAsProfile = true;
650     }
651     else
652     {
653       option.ImportAsPolyXY = false;
654       option.ImportAsProfile = false;
655     }
656     options.push_back(option);
657   }  
658
659   aSinusXImporter.Import(aDoc, importedEntities, &options);
660   CPPUNIT_ASSERT_EQUAL (importedEntities.Size(), 60);
661 }
662
663 void test_HYDROData_PolylineXY::test_polyline_dbf_info_simple()
664 {
665   Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( 1 );
666   Handle(HYDROData_PolylineXY) aPolyline = Handle(HYDROData_PolylineXY)::DownCast(aDoc->CreateObject(KIND_POLYLINEXY));
667   QStringList dbf_dummy, dbf_out;
668   dbf_dummy << "n1" << "n2" << "n3" << "n4";
669   aPolyline->SetDBFInfo(dbf_dummy);
670   CPPUNIT_ASSERT (aPolyline->GetDBFInfo(dbf_out));
671   CPPUNIT_ASSERT_EQUAL (dbf_out.size(), 4);
672   CPPUNIT_ASSERT ("n1" == dbf_out[0]);
673   CPPUNIT_ASSERT ("n2" == dbf_out[1]);
674   CPPUNIT_ASSERT ("n3" == dbf_out[2]);
675   CPPUNIT_ASSERT ("n4" == dbf_out[3]);
676 }
677
678