X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_GeoreferencementOp.cxx;h=eb89f4c471b89df580dae8eeecf46d1b5ef238c1;hb=f3535c63440d6ca7b7662d92ce6af3526560d56b;hp=e1dfd89d2b903eeee05137d53dd727c109e42380;hpb=03ac40d409e4ca78dca10fd5d1fb3bf35e033a41;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_GeoreferencementOp.cxx b/src/HYDROGUI/HYDROGUI_GeoreferencementOp.cxx index e1dfd89d..eb89f4c4 100644 --- a/src/HYDROGUI/HYDROGUI_GeoreferencementOp.cxx +++ b/src/HYDROGUI/HYDROGUI_GeoreferencementOp.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 @@ -36,6 +32,7 @@ #include #include +#include #include #include @@ -64,15 +61,14 @@ void HYDROGUI_GeoreferencementOp::startOperation() } aPanel->reset(); + setPreviewManager( ::qobject_cast( + module()->getApp()->getViewManager( OCCViewer_Viewer::Type(), true ) ) ); + setCursor(); if ( myInitialMode == All ) { - int anAllMode = HYDROGUI_GeoreferencementDlg::AllProfiles; - aPanel->setMode( anAllMode ); - onModeActivated( anAllMode ); + onModeActivated( HYDROGUI_GeoreferencementDlg::AllProfiles ); } else if ( myInitialMode == Selected ) { - int aSelectionMode = HYDROGUI_GeoreferencementDlg::SelectedProfiles; - aPanel->setMode( aSelectionMode ); - onModeActivated( aSelectionMode ); + onModeActivated( HYDROGUI_GeoreferencementDlg::SelectedProfiles ); } LightApp_Application* anApp = module()->getApp(); @@ -80,20 +76,33 @@ void HYDROGUI_GeoreferencementOp::startOperation() dynamic_cast( anApp->getViewManager( OCCViewer_Viewer::Type(), false ) ); if ( aViewManager ) { connect( aViewManager, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ), - aPanel, SLOT( onMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) ); + aPanel, SLOT( onMousePress( SUIT_ViewWindow*, QMouseEvent* ) ), + Qt::UniqueConnection ); } connect( anApp->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ), - this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) ); + this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); } void HYDROGUI_GeoreferencementOp::abortOperation() { + LightApp_Application* anApp = module()->getApp(); + if ( anApp && anApp->desktop() ) { + anApp->desktop()->disconnect( this ); + } + + restoreCursor(); HYDROGUI_Operation::abortOperation(); } void HYDROGUI_GeoreferencementOp::commitOperation() { + LightApp_Application* anApp = module()->getApp(); + if ( anApp && anApp->desktop() ) { + anApp->desktop()->disconnect( this ); + } + + restoreCursor(); HYDROGUI_Operation::commitOperation(); } @@ -101,13 +110,116 @@ HYDROGUI_InputPanel* HYDROGUI_GeoreferencementOp::createInputPanel() const { HYDROGUI_InputPanel* aPanel = new HYDROGUI_GeoreferencementDlg( module(), getName() ); connect( aPanel, SIGNAL( modeActivated( int ) ), SLOT( onModeActivated( int ) ) ); + connect( aPanel, SIGNAL( updateSelection() ), SLOT( onUpdateSelection() ) ); return aPanel; } bool HYDROGUI_GeoreferencementOp::processApply( int& theUpdateFlags, - QString& theErrorMsg ) + QString& theErrorMsg, + QStringList& theBrowseObjectsEntries ) { + theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced | UF_VTKViewer | UF_VTK_Forced | UF_VTK_Init; + + return store( theErrorMsg ); +} + +void HYDROGUI_GeoreferencementOp::onModeActivated( const int theActualMode ) +{ + QString anErrorMsg; + + // Get the panel + HYDROGUI_GeoreferencementDlg* aPanel = + ::qobject_cast( inputPanel() ); + if ( !aPanel ) { + return; + } + + aPanel->setMode( theActualMode == HYDROGUI_GeoreferencementDlg::AllProfiles ? + HYDROGUI_GeoreferencementDlg::SelectedProfiles : + HYDROGUI_GeoreferencementDlg::AllProfiles); + + // Store the dialog data to the data model + bool isToStore = false; + // Check if modifications exists + if ( aPanel->isModified() ) { + // Show confirmation dialog + SUIT_MessageBox::StandardButtons aButtons = + SUIT_MessageBox::Yes | SUIT_MessageBox::No; + + isToStore = SUIT_MessageBox::question( module()->getApp()->desktop(), + tr( "CONFIRMATION" ), + tr( "CONFIRM_STORE" ), + aButtons, + SUIT_MessageBox::Yes) == SUIT_MessageBox::Yes; + } + // Store modifications if needed + if ( isToStore ) + { + startDocOperation(); + if ( !store( anErrorMsg ) ) + { + abortDocOperation(); + + anErrorMsg.append( "\n" + tr( "INPUT_VALID_DATA" ) ); + SUIT_MessageBox::critical( module()->getApp()->desktop(), + tr( "INSUFFICIENT_INPUT_DATA" ), + anErrorMsg ); + return; + } + else + { + commitDocOperation(); + } + } + + aPanel->setMode( theActualMode ); + + // Get the list of profiles + HYDROData_SequenceOfObjects aSeqOfProfiles; + + if( theActualMode == HYDROGUI_GeoreferencementDlg::AllProfiles ) { + HYDROData_Iterator aProfilesIter( doc(), KIND_PROFILE ); + while ( aProfilesIter.More() ) { + aSeqOfProfiles.Append( aProfilesIter.Current() ); + aProfilesIter.Next(); + } + } else if ( theActualMode == HYDROGUI_GeoreferencementDlg::SelectedProfiles ) { + aSeqOfProfiles = HYDROGUI_Tool::GetSelectedObjects( module() ); + } + + // Set the profiles to the panel + setPanelData( aSeqOfProfiles ); +} + +void HYDROGUI_GeoreferencementOp::onWindowActivated( SUIT_ViewWindow* theViewWindow ) +{ + if ( !theViewWindow ) { + return; + } + + OCCViewer_ViewManager* aViewManager = + dynamic_cast( theViewWindow->getViewManager() ); + + if ( aViewManager ) { + HYDROGUI_GeoreferencementDlg* aPanel = + ::qobject_cast( inputPanel() ); + if ( aPanel ) { + connect( aViewManager, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ), + aPanel, SLOT( onMousePress( SUIT_ViewWindow*, QMouseEvent* ) ), + Qt::UniqueConnection); + } + } +} + +bool HYDROGUI_GeoreferencementOp::store( QString& theErrorMsg ) +{ + // Clear the error string + theErrorMsg.clear(); + + HYDROGUI_Module* aModule = module(); + + // Get the panel HYDROGUI_GeoreferencementDlg* aPanel = ::qobject_cast( inputPanel() ); if ( !aPanel ) { @@ -115,56 +227,70 @@ bool HYDROGUI_GeoreferencementOp::processApply( int& theUpdateFlags, } // Get georeferencement data from the panel - HYDROGUI_GeoreferencementDlg::ProfilesGeoDataMap aGeoDataMap; - aPanel->getData( aGeoDataMap ); + HYDROGUI_GeoreferencementDlg::ProfilesGeoDataList aGeoDataList; + aPanel->getData( aGeoDataList ); + if ( aGeoDataList.empty() ) { + return true; + } - if ( aGeoDataMap.empty() ) { - return false; + // Check the data validity + foreach ( const HYDROGUI_GeoreferencementDlg::ProfileGeoData& aGeoData, aGeoDataList ) { + if ( aGeoData.isIncomplete ) { + theErrorMsg = tr( "INCOMPLETE_DATA" ).arg( aGeoData.Name ); + return false; + } } - // Set the data - foreach ( const QString& aProfileName, aGeoDataMap.keys() ) { + // Store the data in the data model + foreach ( const HYDROGUI_GeoreferencementDlg::ProfileGeoData& aGeoData, aGeoDataList ) { Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( - HYDROGUI_Tool::FindObjectByName( module(), aProfileName, KIND_PROFILE ) ); + HYDROGUI_Tool::FindObjectByName( module(), aGeoData.Name, KIND_PROFILE ) ); if ( !aProfile.IsNull() ) { - HYDROGUI_GeoreferencementDlg::ProfileGeoData aGeoData = - aGeoDataMap.value( aProfileName ); - if ( aGeoData.isValid ) { - aProfile->SetFirstPoint( gp_XY( aGeoData.Xg, aGeoData.Yg ) ); - aProfile->SetLastPoint( gp_XY( aGeoData.Xd, aGeoData.Yd ) ); + if ( !aGeoData.isEmpty ) { + if ( !aProfile->IsValid() ) // Show the profile after it became valid + aModule->setObjectVisible( HYDROGUI_Tool::GetActiveOCCViewId( aModule ), aProfile, true ); + + aProfile->SetLeftPoint( gp_XY( aGeoData.Xg, aGeoData.Yg ), false ); + aProfile->SetRightPoint( gp_XY( aGeoData.Xd, aGeoData.Yd ), false ); } else { aProfile->Invalidate(); + aModule->setObjectVisible( HYDROGUI_Tool::GetActiveOCCViewId( aModule ), aProfile, false ); } + + aProfile->Update(); } } - - theUpdateFlags = UF_Model; + + aModule->update( UF_Model | UF_OCCViewer | UF_OCC_Forced ); + return true; } -void HYDROGUI_GeoreferencementOp::onModeActivated( const int theActualMode ) +void HYDROGUI_GeoreferencementOp::onUpdateSelection() { + // Get the selected profiles + HYDROData_SequenceOfObjects aSeqOfProfiles = + HYDROGUI_Tool::GetSelectedObjects( module() ); + + // Set them to the dialog + setPanelData( aSeqOfProfiles ); +} + +void HYDROGUI_GeoreferencementOp::setPanelData( + const HYDROData_SequenceOfObjects& theProfiles ) +{ + // Get the panel HYDROGUI_GeoreferencementDlg* aPanel = ::qobject_cast( inputPanel() ); if ( !aPanel ) { return; } - HYDROGUI_GeoreferencementDlg::ProfilesGeoDataMap aDataMap; - HYDROData_SequenceOfObjects aSeqOfProfiles; - - if( theActualMode == HYDROGUI_GeoreferencementDlg::AllProfiles ) { - HYDROData_Iterator aProfilesIter( doc(), KIND_PROFILE ); - while ( aProfilesIter.More() ) { - aSeqOfProfiles.Append( aProfilesIter.Current() ); - aProfilesIter.Next(); - } - } else if ( theActualMode == HYDROGUI_GeoreferencementDlg::SelectedProfiles ) { - aSeqOfProfiles = HYDROGUI_Tool::GetSelectedObjects( module() ); - } + // Get georeferencement data from the data model + HYDROGUI_GeoreferencementDlg::ProfilesGeoDataList aData; - HYDROData_SequenceOfObjects::Iterator anIter( aSeqOfProfiles ); + HYDROData_SequenceOfObjects::Iterator anIter( theProfiles ); for ( ; anIter.More(); anIter.Next() ) { Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( anIter.Value() ); @@ -172,37 +298,20 @@ void HYDROGUI_GeoreferencementOp::onModeActivated( const int theActualMode ) continue; } - HYDROGUI_GeoreferencementDlg::ProfileGeoData aGeoData; + HYDROGUI_GeoreferencementDlg::ProfileGeoData aGeoData( aProfile->GetName() ); gp_XY aFirstPoint, aLastPoint; - if ( aProfile->GetFirstPoint( aFirstPoint ) && aProfile->GetLastPoint( aLastPoint ) ) { + if ( aProfile->GetLeftPoint( aFirstPoint, false ) && + aProfile->GetRightPoint( aLastPoint, false ) ) { aGeoData = - HYDROGUI_GeoreferencementDlg::ProfileGeoData( aFirstPoint.X(), aFirstPoint.Y(), + HYDROGUI_GeoreferencementDlg::ProfileGeoData( aGeoData.Name, + aFirstPoint.X(), aFirstPoint.Y(), aLastPoint.X(), aLastPoint.Y() ); } - aDataMap.insert( aProfile->GetName(), aGeoData ); - } - - aPanel->setData( aDataMap ); -} - -void HYDROGUI_GeoreferencementOp::onWindowActivated( SUIT_ViewWindow* theViewWindow ) -{ - if ( !theViewWindow ) { - return; + aData.append( aGeoData ); } - OCCViewer_ViewManager* aViewManager = - dynamic_cast( theViewWindow->getViewManager() ); - - if ( aViewManager ) { - HYDROGUI_GeoreferencementDlg* aPanel = - ::qobject_cast( inputPanel() ); - if ( aPanel ) { - connect( aViewManager, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ), - aPanel, SLOT( onMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) ); - } - } -} - + // Set the collected data to the dialog + aPanel->setData( aData ); +} \ No newline at end of file