From c7cf59e092fe050003d1e556715e3ac97acf6bd4 Mon Sep 17 00:00:00 2001 From: isn Date: Thu, 21 May 2015 17:54:37 +0400 Subject: [PATCH] #refs 522 (very draft) //import only --- src/HYDROGUI/CMakeLists.txt | 2 + src/HYDROGUI/HYDROGUI_ImportPolylineOp.cxx | 245 +++++++++++++++++++++ src/HYDROGUI/HYDROGUI_ImportPolylineOp.h | 60 +++++ src/HYDROGUI/HYDROGUI_Operations.cxx | 9 + src/HYDROGUI/HYDROGUI_Operations.h | 6 +- src/HYDROGUI/resources/HYDROGUI_msg_en.ts | 40 ++++ 6 files changed, 361 insertions(+), 1 deletion(-) create mode 100644 src/HYDROGUI/HYDROGUI_ImportPolylineOp.cxx create mode 100644 src/HYDROGUI/HYDROGUI_ImportPolylineOp.h diff --git a/src/HYDROGUI/CMakeLists.txt b/src/HYDROGUI/CMakeLists.txt index 6f684a9c..b87cd343 100644 --- a/src/HYDROGUI/CMakeLists.txt +++ b/src/HYDROGUI/CMakeLists.txt @@ -32,6 +32,7 @@ set(PROJECT_HEADERS HYDROGUI_ImportBathymetryOp.h HYDROGUI_ImportImageDlg.h HYDROGUI_ImportImageOp.h + HYDROGUI_ImportPolylineOp.h HYDROGUI_InputPanel.h HYDROGUI_LocalCSDlg.h HYDROGUI_LocalCSOp.h @@ -143,6 +144,7 @@ set(PROJECT_SOURCES HYDROGUI_ImportBathymetryOp.cxx HYDROGUI_ImportImageDlg.cxx HYDROGUI_ImportImageOp.cxx + HYDROGUI_ImportPolylineOp.cxx HYDROGUI_InputPanel.cxx HYDROGUI_LocalCSDlg.cxx HYDROGUI_LocalCSOp.cxx diff --git a/src/HYDROGUI/HYDROGUI_ImportPolylineOp.cxx b/src/HYDROGUI/HYDROGUI_ImportPolylineOp.cxx new file mode 100644 index 00000000..f5d365df --- /dev/null +++ b/src/HYDROGUI/HYDROGUI_ImportPolylineOp.cxx @@ -0,0 +1,245 @@ +// 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 +// +// 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 +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HYDROGUI_ImportPolylineOp.h" + +#include "HYDROGUI_DataModel.h" +#include "HYDROGUI_Module.h" +#include "HYDROGUI_UpdateFlags.h" +#include "HYDROGUI_Tool.h" +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include + +HYDROGUI_ImportPolylineOp::HYDROGUI_ImportPolylineOp( HYDROGUI_Module* theModule ) +: HYDROGUI_Operation( theModule ) +{ + setName( tr( "IMPORT_POLYLINE" ) ); +} + +HYDROGUI_ImportPolylineOp::~HYDROGUI_ImportPolylineOp() +{ +} + +void HYDROGUI_ImportPolylineOp::startOperation() +{ + HYDROGUI_Operation::startOperation(); + + myFileDlg = new SUIT_FileDlg( module()->getApp()->desktop(), true ); + myFileDlg->setWindowTitle( getName() ); + myFileDlg->setFileMode( SUIT_FileDlg::ExistingFiles ); + myFileDlg->setFilter( tr("POLYLINE_FILTER") ); + + connect( myFileDlg, SIGNAL( accepted() ), this, SLOT( onApply() ) ); + connect( myFileDlg, SIGNAL( rejected() ), this, SLOT( onCancel() ) ); + + myFileDlg->exec(); +} + +void HYDROGUI_ImportPolylineOp::onApply() +{ + if ( !myFileDlg ) + { + abort(); + return; + } + + QString aFileName = myFileDlg->selectedFile(); + if ( aFileName.isEmpty() ) + { + abort(); + return; + } + + QFile aFile (aFileName); + aFile.open(QIODevice::ReadOnly); + + Parse(aFile); + + QApplication::setOverrideCursor( Qt::WaitCursor ); + + startDocOperation(); + + Process(); + + commitDocOperation(); + commit(); + + module()->update( UF_Model | UF_VTKViewer | UF_VTK_Forced | UF_VTK_Init ); + + aFile.close(); + + QApplication::restoreOverrideCursor(); +} + +void HYDROGUI_ImportPolylineOp::Process() +{ + + Handle(HYDROData_PolylineXY) aPolylineXY = Handle(HYDROData_PolylineXY)::DownCast( doc()->CreateObject( KIND_POLYLINEXY ) ); + + Handle(HYDROData_Polyline3D) aPolylineObj = Handle(HYDROData_Polyline3D)::DownCast( doc()->CreateObject( KIND_POLYLINE ) ); + + Handle(HYDROData_Bathymetry) aBath = Handle(HYDROData_Bathymetry)::DownCast( doc()->CreateObject( KIND_BATHYMETRY ) );; + HYDROData_Bathymetry::AltitudePoints aAPoints; + + int aNSect = myCurveBlocks.size(); + for ( int i = 0 ; i < aNSect ; i++ ) + { + bool aSectClosure = true; + HYDROData_PolylineXY::SectionType aSectType = HYDROData_PolylineXY::SECTION_POLYLINE; + aPolylineXY->AddSection( TCollection_AsciiString(myCurveBlocks[i].myName.toStdString().c_str()), aSectType, myCurveBlocks[i].myIsClosed ); + + for ( int k = 0 ; k < myCurveBlocks[i].myXYZPoints.size() ; k+=3 ) + { + HYDROData_PolylineXY::Point aSectPoint; + aSectPoint.SetX( myCurveBlocks[i].myXYZPoints[k].X() ); + aSectPoint.SetY( myCurveBlocks[i].myXYZPoints[k].Y() ); + aPolylineXY->AddPoint( i, aSectPoint ); + + aAPoints.Append(myCurveBlocks[i].myXYZPoints[k]); + } + } + aPolylineXY->SetName("P_XY"); + aPolylineXY->SetWireColor(HYDROData_PolylineXY::DefaultWireColor()); + aPolylineXY->Update(); + + aBath->SetAltitudePoints(aAPoints); + aBath->SetName("P_B"); + + aPolylineObj->SetPolylineXY (aPolylineXY, false); + aPolylineObj->SetAltitudeObject(aBath); + + aPolylineObj->SetBorderColor( HYDROData_Polyline3D::DefaultBorderColor() ); + aPolylineObj->SetName("P_3D"); + + aPolylineObj->Update(); + + + size_t anActiveViewId = HYDROGUI_Tool::GetActiveGraphicsViewId( module() ); + if ( anActiveViewId == 0 ) + anActiveViewId = HYDROGUI_Tool::GetActiveOCCViewId( module() ); + + module()->setObjectVisible( anActiveViewId, aPolylineXY, true ); + module()->setObjectVisible( anActiveViewId, aPolylineObj, true ); + + module()->setIsToUpdate( aPolylineObj ); +} + +bool HYDROGUI_ImportPolylineOp::Parse( QFile& theFile) +{ + if ( !theFile.isOpen() ) + return false; + + QString aLine; + QString aBLine; + QStringList aList; + QStringList aBList; + myCurveBlocks.clear(); + bool aTotStat = true; + + aLine = theFile.readLine().simplified(); + aList = aLine.split( ' ', QString::SkipEmptyParts ); + + for (;!theFile.atEnd();) + { + if (aList[0] == "B" && (aList[1] == "C" || aList[1] == "P" || aList[1] == "N")) + { + HYDROGUI_CurveBlock aCurveBlockInfo; + if (aList[1] == "C") + aCurveBlockInfo.myType = 1; + else if (aList[1] == "P") + aCurveBlockInfo.myType = 2; + else if (aList[1] == "N") + aCurveBlockInfo.myType = 2; + + QString Name; + do + { + aBLine = theFile.readLine().simplified(); + aBList = aBLine.split( ' ', QString::SkipEmptyParts ); + + if (aBList[0] == "CP") + { + if (aBList.size() == 2 && (aBList[1] == "0" || aBList[1] == "1" || aBList[1] == "2")) + aCurveBlockInfo.myCurvePlane = aBList[1].toInt(); + if (aBList.size() == 3 && (aBList[1] == "0" || aBList[1] == "1") && (aBList[2] == "0" || aBList[2] == "1")) + { + aCurveBlockInfo.myIsClosed = aBList[1].toInt(); + aCurveBlockInfo.myIsClosed = aBList[2].toInt(); + } + } + if (aBList[0] == "CN") + { + for (int i = 1; i < aBList.size(); i++) + Name += aBList[i] + "_"; + Name.remove(Name.size() - 1, 1); + aCurveBlockInfo.myName = Name; + } + } while (!theFile.atEnd() && aBLine[0] == 'C' ); + + bool aStat; + aTotStat = true; + do + { + if (aBList.size() >= 3 && aBLine[0] != 'B' && aBLine[0] != 'C') { + gp_XYZ anXYZ; + anXYZ.SetX (aBList[0].toDouble(&aStat)); + aTotStat = aTotStat && aStat; + anXYZ.SetY (aBList[1].toDouble(&aStat)); + aTotStat = aTotStat && aStat; + anXYZ.SetZ (aBList[2].toDouble(&aStat)); + aTotStat = aTotStat && aStat; + + aCurveBlockInfo.myXYZPoints.push_back(anXYZ); + + aBLine = theFile.readLine().simplified(); + aBList = aBLine.split( ' ', QString::SkipEmptyParts ); + } + else + break; + + } while (!theFile.atEnd()/* && aBLine[0] == 'B'*/ ); + if (aTotStat) + myCurveBlocks.push_back(aCurveBlockInfo); + + } + else + { + aLine = theFile.readLine().simplified(); + aList = aLine.split( ' ', QString::SkipEmptyParts ); + } + + } + + return true; + +} \ No newline at end of file diff --git a/src/HYDROGUI/HYDROGUI_ImportPolylineOp.h b/src/HYDROGUI/HYDROGUI_ImportPolylineOp.h new file mode 100644 index 00000000..4e7a066e --- /dev/null +++ b/src/HYDROGUI/HYDROGUI_ImportPolylineOp.h @@ -0,0 +1,60 @@ +// 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 +// +// 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 +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef HYDROGUI_IMPORTPOLYLINE_H +#define HYDROGUI_IMPORTPOLYLINE_H + +#include "HYDROGUI_Operation.h" +#include + +class SUIT_FileDlg; +class QFile; +class gp_XYZ; +struct HYDROGUI_CurveBlock +{ + std::vector myXYZPoints; + bool myType; + bool myIsConnected; + bool myIsClosed; + int myCurvePlane; + QString myName; +}; + +class HYDROGUI_ImportPolylineOp : public HYDROGUI_Operation +{ + Q_OBJECT + +public: + HYDROGUI_ImportPolylineOp( HYDROGUI_Module* theModule ); + virtual ~HYDROGUI_ImportPolylineOp(); + +protected: + virtual void startOperation(); + virtual void onApply(); + virtual void Process(); + bool Parse( QFile& theFile ); +private: + SUIT_FileDlg* myFileDlg; + std::vector myCurveBlocks; +}; + +#endif diff --git a/src/HYDROGUI/HYDROGUI_Operations.cxx b/src/HYDROGUI/HYDROGUI_Operations.cxx index c51d90b6..2bef316e 100644 --- a/src/HYDROGUI/HYDROGUI_Operations.cxx +++ b/src/HYDROGUI/HYDROGUI_Operations.cxx @@ -31,6 +31,7 @@ #include "HYDROGUI_DigueOp.h" #include "HYDROGUI_ExportImageOp.h" #include "HYDROGUI_ImportImageOp.h" +#include "HYDROGUI_ImportPolylineOp.h" #include "HYDROGUI_ImportBathymetryOp.h" #include "HYDROGUI_ImmersibleZoneOp.h" #include "HYDROGUI_Module.h" @@ -119,6 +120,8 @@ void HYDROGUI_Module::createActions() createAction( ObserveImageId, "OBSERVE_IMAGE", "OBSERVE_IMAGE_ICO" ); createAction( ExportImageId, "EXPORT_IMAGE", "EXPORT_IMAGE_ICO" ); createAction( RemoveImageRefsId, "REMOVE_IMAGE_REFERENCE", "REMOVE_IMAGE_REFERENCE_ICO" ); + + createAction( ImportPolylineId, "IMPORT_POLYLINE" ); createAction( CreatePolylineId, "CREATE_POLYLINE", "CREATE_POLYLINE_ICO" ); createAction( EditPolylineId, "EDIT_POLYLINE", "EDIT_POLYLINE_ICO" ); @@ -186,6 +189,7 @@ void HYDROGUI_Module::createActions() createAction( RiverBottomId, "CREATE_STREAM_BOTTOM", "CREATE_STREAM_BOTTOM_ICO" ); createAction( RiverBottomContextId, "CREATE_STREAM_BOTTOM", "CREATE_STREAM_BOTTOM_ICO" ); createAction( ProfileInterpolateId, "PROFILE_INTERPOLATE", "PROFILE_INTERPOLATE_ICO" ); + } void HYDROGUI_Module::createMenus() @@ -205,6 +209,7 @@ void HYDROGUI_Module::createMenus() int aHydroMenu = 6; // Edit menu id == 5, View menu id == 10 int aHydroId = createMenu( tr( "MEN_DESK_HYDRO" ), -1, -1, aHydroMenu ); createMenu( ImportImageId, aHydroId, -1, -1 ); + createMenu( ImportPolylineId, aHydroId, -1, -1 ); createMenu( ImportBathymetryId, aHydroId, -1, -1 ); createMenu( CreatePolylineId, aHydroId, -1, -1 ); createMenu( CreatePolyline3DId, aHydroId, -1, -1 ); @@ -249,6 +254,7 @@ void HYDROGUI_Module::createToolbars() createTool( separator(), aToolBar ); createTool( ImportImageId, aToolBar ); + createTool( ImportPolylineId, aToolBar ); createTool( ImportBathymetryId, aToolBar ); createTool( CreatePolylineId, aToolBar ); createTool( CreatePolyline3DId, aToolBar ); @@ -401,6 +407,9 @@ LightApp_Operation* HYDROGUI_Module::createOperation( const int theId ) const case EditImportedImageId: anOp = new HYDROGUI_ImportImageOp( aModule, theId == EditImportedImageId ); break; + case ImportPolylineId: + anOp = new HYDROGUI_ImportPolylineOp( aModule/*, theId == EditImportedPolylineId*/ ); + break; case ObserveImageId: anOp = new HYDROGUI_ObserveImageOp( aModule ); break; diff --git a/src/HYDROGUI/HYDROGUI_Operations.h b/src/HYDROGUI/HYDROGUI_Operations.h index 6c154564..1d61da45 100644 --- a/src/HYDROGUI/HYDROGUI_Operations.h +++ b/src/HYDROGUI/HYDROGUI_Operations.h @@ -109,7 +109,11 @@ enum OperationId RiverBottomId, RiverBottomContextId, - ProfileInterpolateId + ProfileInterpolateId, + + ImportPolylineId, + ExportPolylineId + }; #endif diff --git a/src/HYDROGUI/resources/HYDROGUI_msg_en.ts b/src/HYDROGUI/resources/HYDROGUI_msg_en.ts index 9e3ffb0d..ba09b49d 100644 --- a/src/HYDROGUI/resources/HYDROGUI_msg_en.ts +++ b/src/HYDROGUI/resources/HYDROGUI_msg_en.ts @@ -798,6 +798,10 @@ Would you like to remove all references from the image? DSK_IMPORT_IMAGE Import image + + DSK_IMPORT_POLYLINE + Import polyline from file(s) + DSK_LOAD_VISUAL_STATE Load visual state @@ -1050,6 +1054,10 @@ Would you like to remove all references from the image? MEN_IMPORT_IMAGE Import image + + MEN_IMPORT_POLYLINE + Import polyline + MEN_LOAD_VISUAL_STATE Load visual state @@ -1278,6 +1286,10 @@ Would you like to remove all references from the image? STB_IMPORT_IMAGE Import image + + STB_IMPORT_POLYLINE + Import polyline + STB_LOAD_VISUAL_STATE Load visual state @@ -1875,6 +1887,34 @@ file cannot be correctly imported for an Obstacle definition. + + + HYDROGUI_ImportPolylineOp + + IMPORT_POLYLINE + Import Polyline + + + POLYLINE_FILTER + SinusX Files (*.sx) + + + BAD_IMPORTED_POLYLINE_FILES_TLT + Polyline import error + + + NO_ONE_POLYLINE_IMPORTED + Polyline cannot be read from seleted file + + + BAD_IMPORTED_POLYLINE_FILES + The data from following files cannot be completely imported: +%1 + + + + + HYDROGUI_GeoreferencementDlg -- 2.39.2