]> SALOME platform Git repositories - modules/hydro.git/blob - src/HYDROData/HYDROData_SinusX.cxx
Salome HOME
025810b78afe5043c2b29ec55fa5a35111e0b759
[modules/hydro.git] / src / HYDROData / HYDROData_SinusX.cxx
1 // Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 #include "HYDROData_SinusX.h"
24
25 #include <HYDROData_PolylineXY.h>
26 #include <HYDROData_Bathymetry.h>
27 #include <HYDROData_Entity.h>
28 #include <HYDROData_Document.h>
29 #include <HYDROData_Profile.h>
30 #include <HYDROData_Iterator.h>
31
32 #include <gp_XYZ.hxx>
33 #include <gp_XY.hxx>
34
35 #include <QFile>
36 #include <QFileInfo>
37 #include <QString>
38 #include <QStringList>
39
40 HYDROData_SinusX::HYDROData_SinusX( ) 
41 {
42 }
43
44 HYDROData_SinusX::~HYDROData_SinusX()
45 {
46 }
47
48 void HYDROData_SinusX::CollectExistingNames(Handle_HYDROData_Document theDocument)
49 {
50   HYDROData_Iterator anIter( theDocument );
51   int anInd = 0;
52   myExistingNames.clear();
53   std::vector<int> anAllowedIndexes;
54   for( ; anIter.More(); anIter.Next() )
55     myExistingNames.push_back(anIter.Current()->GetName());
56 }
57
58 QString HYDROData_SinusX::GetName(const QString& theName)
59 {
60   if (myExistingNames.contains(theName))
61   { 
62     QString aName = theName; 
63     while (myExistingNames.contains(aName)) 
64     {
65       QStringList aList = aName.split("_");
66       int aLastInd = aName.lastIndexOf("_");
67       bool IsNum = false; 
68       int anInd = -1;
69       anInd = aList.last().toInt(&IsNum);
70       if (IsNum)
71       {
72         aName = aName.left(aLastInd) + "_";
73         aName+= QString::number(++anInd);
74       }
75       else
76         aName = theName + "_0";
77     }
78
79     myExistingNames.push_back(aName);
80     return aName;
81   }
82   else
83   {
84     myExistingNames.push_back(theName);
85     return theName;
86   }
87
88 }
89
90 }
91
92
93 bool HYDROData_SinusX::Import(const QString& theFilePath, Handle(HYDROData_Document) theDocument, NCollection_Sequence<Handle_HYDROData_Entity>& theEntities)
94 {
95   if ( theFilePath.isEmpty() )
96   { 
97     return false;
98   }
99
100   QString anExt = theFilePath.split('.', QString::SkipEmptyParts).back();
101
102   if (anExt == "sx")
103   {
104     QFile aFile (theFilePath);
105     
106     aFile.open(QIODevice::ReadOnly);
107
108     Parse(aFile);
109    
110     CollectExistingNames(theDocument);
111     SXToHydro(theDocument, theEntities);
112     
113     aFile.close();
114     
115     return true;
116   }
117   else
118     return false;
119
120 }
121
122 void HYDROData_SinusX::SXToHydro(Handle(HYDROData_Document) theDocument, NCollection_Sequence<Handle_HYDROData_Entity>& theEntities)
123
124   for ( size_t i = 0; i < myCurveBlocks.size(); i++ )
125   {
126     if (myCurveBlocks[i].myType == 4) ///  scatter plot -> to bathy
127     {
128       Handle(HYDROData_Bathymetry) aBath = Handle(HYDROData_Bathymetry)::DownCast( theDocument->CreateObject( KIND_BATHYMETRY ) );
129       HYDROData_Bathymetry::AltitudePoints aAPoints;
130       for (size_t j = 0; j < myCurveBlocks[i].myXYZPoints.size(); j++)
131         aAPoints.Append(gp_XYZ (myCurveBlocks[i].myXYZPoints[j]));
132
133       aBath->SetAltitudePoints(aAPoints);
134       aBath->SetName(GetName(myCurveBlocks[i].myName + "_bath"));
135       theEntities.Append(aBath);
136     }
137     if (myCurveBlocks[i].myType == 1 || myCurveBlocks[i].myType == 3)
138     {
139       NCollection_Sequence<gp_XYZ> aPoints;
140       for (size_t j = 0; j < myCurveBlocks[i].myXYZPoints.size(); j++)
141         aPoints.Append(gp_XYZ (myCurveBlocks[i].myXYZPoints[j]));
142       /*if (myCurveBlocks[i].myIsClosed)
143         aPoints.Append(gp_XYZ (myCurveBlocks[i].myXYZPoints[0]));*/
144       Handle(HYDROData_ProfileUZ) aProfileUZ = Handle(HYDROData_ProfileUZ)::DownCast( theDocument->CreateObject( KIND_PROFILEUZ ) );
145       Handle(HYDROData_PolylineXY) aPolyXY = Handle(HYDROData_PolylineXY)::DownCast( theDocument->CreateObject( KIND_POLYLINEXY ) );
146       aPolyXY->AddSection( "",  
147         myCurveBlocks[i].myIsSpline ? HYDROData_PolylineXY::SECTION_SPLINE : HYDROData_PolylineXY::SECTION_POLYLINE, 
148         myCurveBlocks[i].myIsClosed ? true : false); 
149       aProfileUZ->CalculateAndAddPoints(aPoints, aPolyXY);
150       Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( theDocument->CreateObject( KIND_PROFILE ) );
151       aProfile->SetParametricPoints(aProfileUZ->GetPoints());
152       aPolyXY->SetName(GetName(myCurveBlocks[i].myName + "_polyXY"));
153       aProfileUZ->SetName(GetName(myCurveBlocks[i].myName + "_profileUZ"));
154       aProfile->SetName(GetName(myCurveBlocks[i].myName + "_profile"));
155       theEntities.Append(aPolyXY);
156       theEntities.Append(aProfileUZ);
157       theEntities.Append(aProfile);
158     }
159     if (myCurveBlocks[i].myType == 2)
160     {
161       if (myCurveBlocks[i].myCurvePlane == 2)
162       {
163         if (myCurveBlocks[i].myAdditionalCurveInfo.size() == 4)
164         {
165           Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( theDocument->CreateObject( KIND_PROFILE ) );
166           HYDROData_ProfileUZ::PointsList aPointList;
167           for (size_t j = 0; j < myCurveBlocks[i].myXYZPoints.size(); j++)
168             aPointList.Append(gp_XY (myCurveBlocks[i].myXYZPoints[j].X(), myCurveBlocks[i].myXYZPoints[j].Z()));
169           aProfile->GetProfileUZ()->SetSectionType(0,  myCurveBlocks[i].myIsSpline ? HYDROData_PolylineXY::SECTION_SPLINE : HYDROData_PolylineXY::SECTION_POLYLINE);
170           aProfile->GetProfileUZ()->SetSectionClosed(0, myCurveBlocks[i].myIsClosed ? true : false);
171           aProfile->SetParametricPoints(aPointList);
172           if ( ! (myCurveBlocks[i].myAdditionalCurveInfo[0] == 0 &&  myCurveBlocks[i].myAdditionalCurveInfo[1] == 0 && 
173             myCurveBlocks[i].myAdditionalCurveInfo[2] == 0 && myCurveBlocks[i].myAdditionalCurveInfo[3] == 0) )
174           {
175             aProfile->SetLeftPoint(gp_XY(myCurveBlocks[i].myAdditionalCurveInfo[0], myCurveBlocks[i].myAdditionalCurveInfo[1]));
176             aProfile->SetRightPoint(gp_XY(myCurveBlocks[i].myAdditionalCurveInfo[2], myCurveBlocks[i].myAdditionalCurveInfo[3]));
177             aProfile->Update();
178           }
179           aProfile->SetName(GetName(myCurveBlocks[i].myName + "_profile"));
180           theEntities.Append(aProfile);
181         }
182       }
183       if (myCurveBlocks[i].myCurvePlane == 0)
184       {
185         Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( theDocument->CreateObject( KIND_PROFILE ) );
186         HYDROData_Profile::ProfilePoints aPointList;
187         for (size_t j = 0; j < myCurveBlocks[i].myXYZPoints.size(); j++)
188           aPointList.Append(myCurveBlocks[i].myXYZPoints[j]);
189         aProfile->GetProfileUZ()->SetSectionType(0,  myCurveBlocks[i].myIsSpline ? HYDROData_PolylineXY::SECTION_SPLINE : HYDROData_PolylineXY::SECTION_POLYLINE);
190         aProfile->GetProfileUZ()->SetSectionClosed(0, myCurveBlocks[i].myIsClosed ? true : false);
191         aProfile->SetProfilePoints(aPointList);
192         aProfile->SetName(GetName(myCurveBlocks[i].myName + "_profile"));
193         theEntities.Append(aProfile);
194       }
195     }
196   }
197
198 }
199  
200
201 bool HYDROData_SinusX::Parse(QFile& theFile)
202 {
203   if ( !theFile.isOpen() )
204     return false;
205
206   QString aLine;
207   QString aBLine;
208   QStringList aList;
209   QStringList aBList;
210   myCurveBlocks.clear();
211   bool aTotStat = true;
212
213   aLine = theFile.readLine().simplified();
214   aList = aLine.split( ' ', QString::SkipEmptyParts );
215
216   for (;!theFile.atEnd();) 
217   {
218     if (aList[0] == "B" && (aList[1] == "C" || aList[1] == "P" || aList[1] == "N" || aList[1] == "S" ))
219     {  
220       HYDROGUI_CurveBlock aCurveBlockInfo;
221       if (aList[1] == "C")
222         aCurveBlockInfo.myType = 1;
223       else if (aList[1] == "P")
224         aCurveBlockInfo.myType = 2;
225       else if (aList[1] == "N")
226         aCurveBlockInfo.myType = 3;
227       else if (aList[1] == "S")
228         aCurveBlockInfo.myType = 4;
229
230       if (aList.size() == 9)
231       {
232         for (int j = 2; j < 8; j++)
233           aCurveBlockInfo.myRefCoords.push_back(aList[j].toDouble());
234         aCurveBlockInfo.myRefRatio = aList[8].toDouble();
235       }
236
237       QString Name;
238       do
239       {
240         aBLine = theFile.readLine().simplified();
241         aBList = aBLine.split( ' ', QString::SkipEmptyParts );
242          
243         if (aBList[0] == "CP")
244         {
245           if (aBList.size() == 2 && (aBList[1] == "0" || aBList[1] == "1" || aBList[1] == "2"))
246             aCurveBlockInfo.myCurvePlane = aBList[1].toInt();
247           else if (aBList.size() == 3 && (aBList[1] == "0" || aBList[1] == "1") && (aBList[2] == "0" || aBList[2] == "1"))
248           {
249             aCurveBlockInfo.myIsClosed = aBList[1].toInt();
250             aCurveBlockInfo.myIsSpline = aBList[2].toInt();
251           }
252           else
253           {
254             for (int j = 1; j < aBList.size(); j++)
255               aCurveBlockInfo.myAdditionalCurveInfo.push_back(aBList[j].toDouble());
256           }
257         }
258         if (aBList[0] == "CN")
259         {
260            for (int i = 1; i < aBList.size(); i++)
261              Name += aBList[i] + "_"; 
262            Name.remove(Name.size() - 1, 1);
263            aCurveBlockInfo.myName = Name;
264         }
265       } while (!theFile.atEnd() && aBLine[0] == 'C' );
266
267       bool aStat;
268       aTotStat = true;
269       do
270       {
271         if (aBList.size() >= 3 && aBLine[0] != 'B' && aBLine[0] != 'C') {
272           gp_XYZ anXYZ;
273           anXYZ.SetX (aBList[0].toDouble(&aStat));  
274           aTotStat = aTotStat && aStat;
275           anXYZ.SetY (aBList[1].toDouble(&aStat));
276           aTotStat = aTotStat && aStat;
277           anXYZ.SetZ (aBList[2].toDouble(&aStat));
278           aTotStat = aTotStat && aStat;
279
280           aCurveBlockInfo.myXYZPoints.push_back(anXYZ);
281           
282           aBLine = theFile.readLine().simplified();
283           aBList = aBLine.split( ' ', QString::SkipEmptyParts );
284         }
285         else 
286           break;
287     
288       } while (!theFile.atEnd() || !aBLine.isEmpty());
289       if (aTotStat)
290         myCurveBlocks.push_back(aCurveBlockInfo);
291
292       aLine = aBLine;
293       aList = aBList;
294
295     }
296     else
297     {
298       aLine = theFile.readLine().simplified();
299       aList = aLine.split( ' ', QString::SkipEmptyParts );
300     }
301
302   }
303
304   return true;
305
306 }
307