X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_ImportBathymetryOp.cxx;h=02ea51ac293063d1dff35c8ef40ae345dfa2bcc9;hb=39b1848f103d89cfb544a1651b3fbf221fc2c401;hp=2654523a0c8b6a0f4ec1a566d6a6a5a01f293576;hpb=84f8b4a57d3cdad820bc1333a5066699cd1c8ae3;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_ImportBathymetryOp.cxx b/src/HYDROGUI/HYDROGUI_ImportBathymetryOp.cxx index 2654523a..02ea51ac 100644 --- a/src/HYDROGUI/HYDROGUI_ImportBathymetryOp.cxx +++ b/src/HYDROGUI/HYDROGUI_ImportBathymetryOp.cxx @@ -1,12 +1,8 @@ -// Copyright (C) 2007-2013 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 -// version 2.1 of the License. +// 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 @@ -23,22 +19,32 @@ #include "HYDROGUI_ImportBathymetryOp.h" #include "HYDROGUI_DataModel.h" +#include "HYDROGUI_DataObject.h" #include "HYDROGUI_ImportBathymetryDlg.h" #include "HYDROGUI_Module.h" #include "HYDROGUI_Tool.h" +#include "HYDROGUI_Tool2.h" #include "HYDROGUI_UpdateFlags.h" #include #include #include +#include +#include #include +#include +#include +#include + -HYDROGUI_ImportBathymetryOp::HYDROGUI_ImportBathymetryOp( HYDROGUI_Module* theModule ) -: HYDROGUI_Operation( theModule ) +HYDROGUI_ImportBathymetryOp::HYDROGUI_ImportBathymetryOp( HYDROGUI_Module* theModule, + const bool theIsEdit ) +: HYDROGUI_Operation( theModule ), + myIsEdit( theIsEdit ) { - setName( tr( "IMPORT_BATHYMETRY" ) ); + setName( theIsEdit ? tr( "EDIT_IMPORTED_BATHYMETRY" ) : tr( "IMPORT_BATHYMETRY" ) ); } HYDROGUI_ImportBathymetryOp::~HYDROGUI_ImportBathymetryOp() @@ -55,6 +61,25 @@ void HYDROGUI_ImportBathymetryOp::startOperation() return; aPanel->reset(); + + if( myIsEdit ) + { + if ( isApplyAndClose() ) + myEditedObject = Handle(HYDROData_Bathymetry)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) ); + if( !myEditedObject.IsNull() ) + { + QString aName = myEditedObject->GetName(); + QStringList aFileNames = myEditedObject->GetFilePaths(); + bool anIsAltitudesInverted = myEditedObject->IsAltitudesInverted(); + + aPanel->setFuseIntoOneOptionChecked( true ); + + aPanel->setObjectName( aName ); + aPanel->setFileNames( aFileNames ); + aPanel->setInvertAltitudes( anIsAltitudesInverted ); + aPanel->setFuseIntoOneOptionEnabled( false ); + } + } } void HYDROGUI_ImportBathymetryOp::abortOperation() @@ -71,13 +96,14 @@ HYDROGUI_InputPanel* HYDROGUI_ImportBathymetryOp::createInputPanel() const { HYDROGUI_InputPanel* aPanel = new HYDROGUI_ImportBathymetryDlg( module(), getName() ); - connect ( aPanel, SIGNAL( FileSelected( const QString& ) ), SLOT( onFileSelected() ) ); + connect ( aPanel, SIGNAL( FileSelected( const QStringList& ) ), SLOT( onFileSelected() ) ); return aPanel; } bool HYDROGUI_ImportBathymetryOp::processApply( int& theUpdateFlags, - QString& theErrorMsg ) + QString& theErrorMsg, + QStringList& theBrowseObjectsEntries ) { HYDROGUI_ImportBathymetryDlg* aPanel = ::qobject_cast( inputPanel() ); @@ -91,45 +117,174 @@ bool HYDROGUI_ImportBathymetryOp::processApply( int& theUpdateFlags, return false; } - QString aFileName = aPanel->getFileName().simplified(); - if ( aFileName.isEmpty() ) + QStringList aFileNames = aPanel->getFileNames(); + + QStringList DummyFileList; + foreach (QString str, aFileNames) + DummyFileList << str.simplified(); + + aFileNames = DummyFileList; + DummyFileList.clear(); + + if ( aFileNames.isEmpty() ) { - theErrorMsg = tr( "INCORRECT_FILE_NAME" ); + theErrorMsg = tr( "EMPTY_FILENAMES" ); return false; } - QFileInfo aFileInfo( aFileName ); - if ( !aFileInfo.exists() || !aFileInfo.isReadable() ) + QString inexistWarn; + + foreach (QString aFileName, aFileNames ) { - theErrorMsg = tr( "FILE_NOT_EXISTS_OR_CANT_BE_READ" ).arg( aFileName ); - return false; + QFileInfo aFileInfo( aFileName ); + if ( !aFileInfo.exists() || !aFileInfo.isReadable() ) + { + inexistWarn += "\n" + aFileName; + continue; + } + DummyFileList << aFileName; } - // check that there are no other objects with the same name in the document - Handle(HYDROData_Entity) anObject = HYDROGUI_Tool::FindObjectByName( module(), anObjectName ); - if ( !anObject.IsNull() ) + if (!inexistWarn.isNull()) + SUIT_MessageBox::warning( module()->getApp()->desktop(), + tr( "BATHEMETRY_IMPORT_WARNING" ), "Can't read the next files:" + inexistWarn ); + + aFileNames = DummyFileList; + + bool isFuseIntoOneOption = aPanel->isFuseIntoOneOptionChecked(); + bool anIsInvertAltitudes = aPanel->isInvertAltitudes(); + + QString replacemWarn; + QString UnreadFilesWarn; + + if ( myIsEdit ) { - theErrorMsg = tr( "OBJECT_EXISTS_IN_DOCUMENT" ).arg( anObjectName ); - return false; + //edit already existing bath + if (myEditedObject.IsNull()) + return false; + QStringList anOldFileNames = myEditedObject->GetFilePaths(); + bool anIsInvertAltitudes = aPanel->isInvertAltitudes(); + myEditedObject->SetAltitudesInverted( anIsInvertAltitudes, false ); + if ( aFileNames.toSet() != anOldFileNames.toSet() ) + { + myEditedObject->SetAltitudesInverted( anIsInvertAltitudes, false ); + if ( !myEditedObject->ImportFromFiles( aFileNames ) ) + { + theErrorMsg = tr( "BAD_IMPORTED_BATHYMETRY_FILE" ).arg( aFileNames.join("\n") ); + return false; + } + } + else if ( anIsInvertAltitudes != myEditedObject->IsAltitudesInverted() ) + myEditedObject->SetAltitudesInverted( anIsInvertAltitudes ); + + QString aNewObjName; + if (CheckNameExistingBathy(anObjectName, aNewObjName)) + { + myEditedObject->SetName( aNewObjName ); + replacemWarn += "\n'" + anObjectName + "' => '" + aNewObjName + "'"; + } + else + myEditedObject->SetName( anObjectName ); + myEditedObject->Update(); } + else + { + //create the new one + if (isFuseIntoOneOption) + { + Handle(HYDROData_Bathymetry) aBathymetryObj = Handle(HYDROData_Bathymetry)::DownCast( doc()->CreateObject( KIND_BATHYMETRY ) ); + if ( aBathymetryObj.IsNull() ) + return false; + aBathymetryObj->SetAltitudesInverted( anIsInvertAltitudes, false ); + if ( !aBathymetryObj->ImportFromFiles( aFileNames ) ) + { + theErrorMsg = tr( "BAD_IMPORTED_BATHYMETRY_FILE" ).arg( aFileNames.join("\n") ); + return false; + } - Handle(HYDROData_Bathymetry) aBathymetryObj = - Handle(HYDROData_Bathymetry)::DownCast( doc()->CreateObject( KIND_BATHYMETRY ) ); - if ( aBathymetryObj.IsNull() ) - return false; + QString aNewObjName; + if (CheckNameExistingBathy(anObjectName, aNewObjName)) + { + aBathymetryObj->SetName( aNewObjName ); + replacemWarn += "\n'" + anObjectName + "' => '" + aNewObjName + "'"; + } + else + aBathymetryObj->SetName( anObjectName ); + + aBathymetryObj->SetName( anObjectName ); + aBathymetryObj->Update(); + QString anEntry = HYDROGUI_DataObject::dataObjectEntry( aBathymetryObj ); + theBrowseObjectsEntries.append( anEntry ); + } + else //myedit off + non-fuse => import separate files + { + bool AtLeastOneWasImported = false; + foreach (QString filename, aFileNames) + { + Handle(HYDROData_Bathymetry) aBathymetryObj = Handle(HYDROData_Bathymetry)::DownCast( doc()->CreateObject( KIND_BATHYMETRY ) ); + if ( aBathymetryObj.IsNull() ) + continue; + aBathymetryObj->SetAltitudesInverted( anIsInvertAltitudes, false ); + if ( !aBathymetryObj->ImportFromFiles( QStringList(filename) ) ) + { + UnreadFilesWarn += "\n" + filename; + continue; + } + + QString anObjectName = QFileInfo( filename ).baseName(); + QString aNewObjName; + if (CheckNameExistingBathy(anObjectName, aNewObjName)) + { + aBathymetryObj->SetName( aNewObjName ); + replacemWarn += "\n'" + anObjectName + "' => '" + aNewObjName + "'"; + } + else + aBathymetryObj->SetName( anObjectName ); + + AtLeastOneWasImported = true; + aBathymetryObj->Update(); + QString anEntry = HYDROGUI_DataObject::dataObjectEntry( aBathymetryObj ); + theBrowseObjectsEntries.append( anEntry ); + } + if (!AtLeastOneWasImported) + { + theErrorMsg = tr( "BAD_IMPORTED_BATHYMETRY_FILES" ).arg( aFileNames.join("\n") ); + return false; + } + } + } + + if (!UnreadFilesWarn.isNull()) + SUIT_MessageBox::warning( module()->getApp()->desktop(), + tr( "BATHEMETRY_IMPORT_WARNING" ), "The next files cannot be imported:" + UnreadFilesWarn ); + + + if (!replacemWarn.isNull()) + SUIT_MessageBox::warning( module()->getApp()->desktop(), + tr( "BATHEMETRY_IMPORT_WARNING" ), "The next objects names are already exist in the document; so the new objects was renamed:" + replacemWarn ); - if ( !aBathymetryObj->ImportFromFile( aFileName ) ) + // Activate VTK viewer and show the bathymetry + SUIT_ViewManager* aVTKMgr = 0; + SUIT_ViewManager* aViewMgr = module()->getApp()->activeViewManager(); + // Try to get a VTK viewer as an active or existing one + if ( aViewMgr ) { - theErrorMsg = tr( "BAD_IMPORTED_BATHYMETRY_FILE" ).arg( aFileName ); - return false; + if ( aViewMgr->getType() == SVTK_Viewer::Type() ) + { + aVTKMgr = aViewMgr; + } + else + { + aVTKMgr = module()->getApp()->viewManager( SVTK_Viewer::Type() ); + } } - aBathymetryObj->SetName( anObjectName ); + theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced | + UF_VTKViewer | UF_VTK_Forced; - theUpdateFlags = UF_Model; return true; } - + void HYDROGUI_ImportBathymetryOp::onFileSelected() { HYDROGUI_ImportBathymetryDlg* aPanel = @@ -137,13 +292,37 @@ void HYDROGUI_ImportBathymetryOp::onFileSelected() if ( !aPanel ) return; + QStringList aFileNames = aPanel->getFileNames(); + if ( !aPanel->isFuseIntoOneOptionEnabled() ) + aPanel->setFuseIntoOneOptionEnabled( !myIsEdit && aFileNames.count() > 1 ); + QString anObjectName = aPanel->getObjectName().simplified(); if ( anObjectName.isEmpty() ) { - anObjectName = HYDROGUI_Tool::GenerateObjectName( module(), "Bathymetry" ); + if (aFileNames.count() == 1) + { + anObjectName = aFileNames[0]; + if ( !anObjectName.isEmpty() ) + anObjectName = QFileInfo( anObjectName ).baseName(); + } + + if ( anObjectName.isEmpty() ) { + anObjectName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_BATHYMETRY_NAME" ) ); + } aPanel->setObjectName( anObjectName ); } } +bool HYDROGUI_ImportBathymetryOp::CheckNameExistingBathy(const QString& InpName, QString& OutputName) +{ + Handle(HYDROData_Entity) anObject = HYDROGUI_Tool::FindObjectByName( module(), InpName ); + if (anObject.IsNull()) + return false; + else + { + OutputName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_BATHYMETRY_NAME" ) ); + return true; + } +}