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