X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_SinusX.cxx;h=9fcbef117ca52015ba3832dbf3ba374bef8dbcaa;hb=d398a8be8e0b0259b476b358d53d234ce4c82379;hp=5c0c6f5a9fbecd8fd4359515325d64a7fc2a3699;hpb=a2ce1a12f9a6ce4ff9965ea60147ed8d90ffb797;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_SinusX.cxx b/src/HYDROData/HYDROData_SinusX.cxx index 5c0c6f5a..9fcbef11 100644 --- a/src/HYDROData/HYDROData_SinusX.cxx +++ b/src/HYDROData/HYDROData_SinusX.cxx @@ -1,8 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// +// Copyright (C) 2014-2015 EDF-R&D // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either @@ -27,6 +23,7 @@ #include #include #include +#include #include #include @@ -35,6 +32,8 @@ #include #include #include +#include +#include HYDROData_SinusX::HYDROData_SinusX( ) { @@ -44,6 +43,48 @@ HYDROData_SinusX::~HYDROData_SinusX() { } +void HYDROData_SinusX::CollectExistingNames(Handle_HYDROData_Document theDocument) +{ + HYDROData_Iterator anIter( theDocument ); + int anInd = 0; + myExistingNames.clear(); + std::vector anAllowedIndexes; + for( ; anIter.More(); anIter.Next() ) + myExistingNames.push_back(anIter.Current()->GetName()); +} + +QString HYDROData_SinusX::GetName(const QString& theName) +{ + if (myExistingNames.contains(theName)) + { + QString aName = theName; + while (myExistingNames.contains(aName)) + { + QStringList aList = aName.split("_"); + int aLastInd = aName.lastIndexOf("_"); + bool IsNum = false; + int anInd = -1; + anInd = aList.last().toInt(&IsNum); + if (IsNum) + { + aName = aName.left(aLastInd) + "_"; + aName+= QString::number(++anInd); + } + else + aName = theName + "_0"; + } + + myExistingNames.push_back(aName); + return aName; + } + else + { + myExistingNames.push_back(theName); + return theName; + } + +} + bool HYDROData_SinusX::Import(const QString& theFilePath, Handle(HYDROData_Document) theDocument, NCollection_Sequence& theEntities) { @@ -62,6 +103,7 @@ bool HYDROData_SinusX::Import(const QString& theFilePath, Handle(HYDROData_Docum Parse(aFile); + CollectExistingNames(theDocument); SXToHydro(theDocument, theEntities); aFile.close(); @@ -81,36 +123,53 @@ void HYDROData_SinusX::SXToHydro(Handle(HYDROData_Document) theDocument, NCollec { Handle(HYDROData_Bathymetry) aBath = Handle(HYDROData_Bathymetry)::DownCast( theDocument->CreateObject( KIND_BATHYMETRY ) ); HYDROData_Bathymetry::AltitudePoints aAPoints; - for (size_t j = 0; j < myCurveBlocks[i].myXYZPoints.size(); j++) - aAPoints.Append(gp_XYZ (myCurveBlocks[i].myXYZPoints[j])); + size_t n = myCurveBlocks[i].myXYZPoints.size(); + aAPoints.reserve( n ); + for (size_t j = 0; j < n; j++) + { + gp_XYZ aLocalPoint = gp_XYZ (myCurveBlocks[i].myXYZPoints[j]); + theDocument->Transform(aLocalPoint, true); + HYDROData_Bathymetry::AltitudePoint p; + p.X = aLocalPoint.X(); + p.Y = aLocalPoint.Y(); + p.Z = aLocalPoint.Z(); + aAPoints.push_back(p); + } aBath->SetAltitudePoints(aAPoints); - aBath->SetName(myCurveBlocks[i].myName); + aBath->SetName(GetName(myCurveBlocks[i].myName)); theEntities.Append(aBath); } - if (myCurveBlocks[i].myType == 1 || myCurveBlocks[i].myType == 3) + if (myCurveBlocks[i].myType == 1 || myCurveBlocks[i].myType == 3) // XYZ curve or isocontour { NCollection_Sequence aPoints; for (size_t j = 0; j < myCurveBlocks[i].myXYZPoints.size(); j++) - aPoints.Append(gp_XYZ (myCurveBlocks[i].myXYZPoints[j])); - if (myCurveBlocks[i].myIsClosed) - aPoints.Append(gp_XYZ (myCurveBlocks[i].myXYZPoints[0])); + { + gp_XYZ aLocalPoint = gp_XYZ (myCurveBlocks[i].myXYZPoints[j]); + theDocument->Transform(aLocalPoint, true); + aPoints.Append(aLocalPoint); + } + /*if (myCurveBlocks[i].myIsClosed) + aPoints.Append(gp_XYZ (myCurveBlocks[i].myXYZPoints[0]));*/ Handle(HYDROData_ProfileUZ) aProfileUZ = Handle(HYDROData_ProfileUZ)::DownCast( theDocument->CreateObject( KIND_PROFILEUZ ) ); Handle(HYDROData_PolylineXY) aPolyXY = Handle(HYDROData_PolylineXY)::DownCast( theDocument->CreateObject( KIND_POLYLINEXY ) ); - aPolyXY->AddSection( "", myCurveBlocks[i].myIsSpline ? HYDROData_PolylineXY::SECTION_SPLINE : HYDROData_PolylineXY::SECTION_POLYLINE, false ); + aPolyXY->AddSection( "", + myCurveBlocks[i].myIsSpline ? HYDROData_PolylineXY::SECTION_SPLINE : HYDROData_PolylineXY::SECTION_POLYLINE, + myCurveBlocks[i].myIsClosed ? true : false); aProfileUZ->CalculateAndAddPoints(aPoints, aPolyXY); Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( theDocument->CreateObject( KIND_PROFILE ) ); aProfile->SetParametricPoints(aProfileUZ->GetPoints()); - aPolyXY->SetName(myCurveBlocks[i].myName + "_polyXY"); - aProfileUZ->SetName(myCurveBlocks[i].myName + "_profileUZ"); - aProfile->SetName(myCurveBlocks[i].myName + "_profile"); + aPolyXY->SetName(GetName(myCurveBlocks[i].myName)); + aProfileUZ->SetName(GetName(myCurveBlocks[i].myName)); + aProfile->SetName(GetName(myCurveBlocks[i].myName)); + aPolyXY->SetWireColor(HYDROData_PolylineXY::DefaultWireColor()); theEntities.Append(aPolyXY); theEntities.Append(aProfileUZ); theEntities.Append(aProfile); } - if (myCurveBlocks[i].myType == 2) + if (myCurveBlocks[i].myType == 2) // XYZ profile { - if (myCurveBlocks[i].myCurvePlane == 2) + if (myCurveBlocks[i].myCurvePlane == 2) // plane XoZ { if (myCurveBlocks[i].myAdditionalCurveInfo.size() == 4) { @@ -118,27 +177,40 @@ void HYDROData_SinusX::SXToHydro(Handle(HYDROData_Document) theDocument, NCollec HYDROData_ProfileUZ::PointsList aPointList; for (size_t j = 0; j < myCurveBlocks[i].myXYZPoints.size(); j++) aPointList.Append(gp_XY (myCurveBlocks[i].myXYZPoints[j].X(), myCurveBlocks[i].myXYZPoints[j].Z())); - + aProfile->GetProfileUZ()->SetSectionType(0, myCurveBlocks[i].myIsSpline ? HYDROData_PolylineXY::SECTION_SPLINE : HYDROData_PolylineXY::SECTION_POLYLINE); + aProfile->GetProfileUZ()->SetSectionClosed(0, myCurveBlocks[i].myIsClosed ? true : false); aProfile->SetParametricPoints(aPointList); if ( ! (myCurveBlocks[i].myAdditionalCurveInfo[0] == 0 && myCurveBlocks[i].myAdditionalCurveInfo[1] == 0 && myCurveBlocks[i].myAdditionalCurveInfo[2] == 0 && myCurveBlocks[i].myAdditionalCurveInfo[3] == 0) ) - { - aProfile->SetLeftPoint(gp_XY(myCurveBlocks[i].myAdditionalCurveInfo[0], myCurveBlocks[i].myAdditionalCurveInfo[1])); - aProfile->SetRightPoint(gp_XY(myCurveBlocks[i].myAdditionalCurveInfo[2], myCurveBlocks[i].myAdditionalCurveInfo[3])); + { // georeferenced profile + double xl = myCurveBlocks[i].myAdditionalCurveInfo[0]; + double yl = myCurveBlocks[i].myAdditionalCurveInfo[1]; + double xr = myCurveBlocks[i].myAdditionalCurveInfo[2]; + double yr = myCurveBlocks[i].myAdditionalCurveInfo[3]; + theDocument->Transform(xl, yl , true); + theDocument->Transform(xr, yr , true); + aProfile->SetLeftPoint(gp_XY(xl, yl)); + aProfile->SetRightPoint(gp_XY(xr, yr)); aProfile->Update(); } - aProfile->SetName(myCurveBlocks[i].myName + "_profile"); + aProfile->SetName(GetName(myCurveBlocks[i].myName)); theEntities.Append(aProfile); } } - if (myCurveBlocks[i].myCurvePlane == 0) + if (myCurveBlocks[i].myCurvePlane == 0) // plane XoY { Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( theDocument->CreateObject( KIND_PROFILE ) ); HYDROData_Profile::ProfilePoints aPointList; for (size_t j = 0; j < myCurveBlocks[i].myXYZPoints.size(); j++) - aPointList.Append(myCurveBlocks[i].myXYZPoints[j]); + { + gp_XYZ aLocalPoint = gp_XYZ (myCurveBlocks[i].myXYZPoints[j]); + theDocument->Transform(aLocalPoint, true); + aPointList.Append(aLocalPoint); + } + aProfile->GetProfileUZ()->SetSectionType(0, myCurveBlocks[i].myIsSpline ? HYDROData_PolylineXY::SECTION_SPLINE : HYDROData_PolylineXY::SECTION_POLYLINE); + aProfile->GetProfileUZ()->SetSectionClosed(0, myCurveBlocks[i].myIsClosed ? true : false); aProfile->SetProfilePoints(aPointList); - aProfile->SetName(myCurveBlocks[i].myName + "_profile"); + aProfile->SetName(GetName(myCurveBlocks[i].myName)); theEntities.Append(aProfile); } } @@ -147,8 +219,6 @@ void HYDROData_SinusX::SXToHydro(Handle(HYDROData_Document) theDocument, NCollec } - - bool HYDROData_SinusX::Parse(QFile& theFile) { if ( !theFile.isOpen() ) @@ -170,13 +240,13 @@ bool HYDROData_SinusX::Parse(QFile& theFile) { HYDROGUI_CurveBlock aCurveBlockInfo; if (aList[1] == "C") - aCurveBlockInfo.myType = 1; + aCurveBlockInfo.myType = 1; // XYZ curve else if (aList[1] == "P") - aCurveBlockInfo.myType = 2; + aCurveBlockInfo.myType = 2; // XYZ profile else if (aList[1] == "N") - aCurveBlockInfo.myType = 3; + aCurveBlockInfo.myType = 3; // isocontour else if (aList[1] == "S") - aCurveBlockInfo.myType = 4; + aCurveBlockInfo.myType = 4; // Scatter plot if (aList.size() == 9) { @@ -209,7 +279,9 @@ bool HYDROData_SinusX::Parse(QFile& theFile) if (aBList[0] == "CN") { for (int i = 1; i < aBList.size(); i++) - Name += aBList[i] + "_"; + Name += aBList[i] + "_"; + if (Name.size() <= 1) + Name = "noname_"; Name.remove(Name.size() - 1, 1); aCurveBlockInfo.myName = Name; } @@ -256,3 +328,107 @@ bool HYDROData_SinusX::Parse(QFile& theFile) } +bool HYDROData_SinusX::Export(const QString& theFilePath, const NCollection_Sequence& theEntities) +{ + if ( theFilePath.isEmpty() ) + { + return false; + } + + QString anExt = theFilePath.split('.', QString::SkipEmptyParts).back(); + + if (anExt == "sx") + { + QFile aFile (theFilePath); + + aFile.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text); + + HydroToSX(aFile, theEntities); + + aFile.close(); + + return true; + } + else + return false; + +} + +void HYDROData_SinusX::HydroToSX(QFile& theFile, const NCollection_Sequence& theEntities) +{ + QTextStream aTextStream(&theFile); + aTextStream << "C Generated by HYDRO Module\n"; + aTextStream << "C\n"; + + for (int i = 1; i <= theEntities.Size(); i++) + { + Handle_HYDROData_Entity anEnt = theEntities.Value(i); + if (anEnt->IsKind( STANDARD_TYPE(HYDROData_Bathymetry) )) + { + Handle(HYDROData_Bathymetry) aBathy = Handle(HYDROData_Bathymetry)::DownCast( anEnt ); + HYDROData_Bathymetry::AltitudePoints anXYZPoints = aBathy->GetAltitudePoints(true); + //Write to stream + aTextStream << "B S\n"; + aTextStream << "CN " << aBathy->GetName() << "\n"; + aTextStream << "CP 0 0\n"; + aTextStream << "CP 0\n"; + for (size_t j = 0, m = anXYZPoints.size(); j < m; j++) + aTextStream << " " << QString::number(anXYZPoints[j].X, 'f', 3) + << " " << QString::number(anXYZPoints[j].Y, 'f', 3) + << " " << QString::number(anXYZPoints[j].Z, 'f', 3) << "\n"; + } + else if (anEnt->IsKind( STANDARD_TYPE(HYDROData_PolylineXY) )) + { + Handle(HYDROData_PolylineXY) aPolyXY = Handle(HYDROData_PolylineXY)::DownCast( anEnt ); + for (int j = 0; j < aPolyXY->NbSections(); j++) + { + //Collect data + bool IsClosed = aPolyXY->IsClosedSection(j); + bool IsSpline = false; + if (aPolyXY->GetSectionType(j) == HYDROData_PolylineXY::SECTION_SPLINE) + IsSpline = true; + HYDROData_PolylineXY::PointsList anXYPoints = aPolyXY->GetPoints(j, true); + //Write to stream + aTextStream << "B N\n"; + aTextStream << "CN " << aPolyXY->GetName() << "\n"; + aTextStream << "CP " << IsClosed << " " << IsSpline << "\n"; + aTextStream << "CP 0.0\n"; + aTextStream << "CP 0\n"; + if (aPolyXY->NbSections() > 1) + aTextStream << "C " << aPolyXY->GetName() << "_section_" << QString::number(j) << "\n"; + for (int k = anXYPoints.Lower(); k <= anXYPoints.Upper(); k++) + aTextStream << " " << QString::number(anXYPoints(k).X(), 'f', 3) + << " " << QString::number(anXYPoints(k).Y(), 'f', 3) + << " 0.000\n"; + } + } + else if (anEnt->IsKind( STANDARD_TYPE(HYDROData_Profile) )) + { + //Collect data + Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( anEnt ); + HYDROData_ProfileUZ::PointsList aPointList = aProfile->GetParametricPoints(); + bool IsClosed = aProfile->GetProfileUZ(false)->IsClosedSection(0);; + bool IsSpline = false; + if (aProfile->GetProfileUZ(false)->GetSectionType(0) == HYDROData_PolylineXY::SECTION_SPLINE) + IsSpline = true; + //Write to stream + aTextStream << "B P\n"; + aTextStream << "CN " << aProfile->GetName() << "\n"; + aTextStream << "CP " << IsClosed << " " << IsSpline << "\n"; + gp_XY aLeftPoint(0.0, 0.0); + gp_XY aRightPoint(0.0, 0.0); + if (aProfile->GetLeftPoint(aLeftPoint, true) && aProfile->GetRightPoint(aRightPoint, true)) + aTextStream << "CP " << QString::number(aLeftPoint.X(), 'f', 3) << " " << + QString::number(aLeftPoint.Y(), 'f', 3) << " " << + QString::number(aRightPoint.X(), 'f', 3) << " " << + QString::number(aRightPoint.Y(), 'f', 3) << "\n"; + else + aTextStream << "CP 0.0 0.0 0.0 0.0\n"; + aTextStream << "CP 2\n"; + for (int k = aPointList.Lower(); k <= aPointList.Upper(); k++) + aTextStream << " " << QString::number(aPointList(k).X(), 'f', 3) + << " 0.000 " + << QString::number(aPointList(k).Y(), 'f', 3) << "\n"; + } + } +}