X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_ImportImageOp.cxx;h=46cbd7ebaf560f42cf84b05f5b7c7dc1127924e3;hb=ca0e09c1e1bb19c9855e2f3839243da36097ee1c;hp=52ea65d9c32263bb5033fef06b230f79b6709471;hpb=779d1c3e386947b6fb1f4807aacfaddeefe7f765;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_ImportImageOp.cxx b/src/HYDROGUI/HYDROGUI_ImportImageOp.cxx index 52ea65d9..46cbd7eb 100644 --- a/src/HYDROGUI/HYDROGUI_ImportImageOp.cxx +++ b/src/HYDROGUI/HYDROGUI_ImportImageOp.cxx @@ -30,6 +30,7 @@ #include "HYDROGUI_UpdateFlags.h" #include +#include #include @@ -73,10 +74,17 @@ void HYDROGUI_ImportImageOp::startOperation() { QImage anImage = myEditedObject->Image(); + int aTransformationMode = myEditedObject->TrsfMode(); + if( aTransformationMode == HYDROGUI_ImportImageDlg::RefImage ) + aTransformationMode = HYDROGUI_ImportImageDlg::ManualCartesian; + aPanel->setTransformationMode( aTransformationMode ); + QPoint aPointA1, aPointB1, aPointC1; QPointF aPointA2, aPointB2, aPointC2; + QPointF aPointA3, aPointB3, aPointC3; myEditedObject->TrsfPoints( aPointA1, aPointB1, aPointC1, - aPointA2, aPointB2, aPointC2 ); + aPointA2, aPointB2, aPointC2, + aPointA3, aPointB3, aPointC3 ); onCreatePreview( anImage ); @@ -95,12 +103,12 @@ void HYDROGUI_ImportImageOp::startOperation() HYDROGUI_ImportImageDlg::TransformationDataMap aDataMap; aDataMap[ HYDROGUI_PrsImage::PointA ] = - HYDROGUI_ImportImageDlg::TransformationData( aPointA1, aPointA2 ); + HYDROGUI_ImportImageDlg::TransformationData( aPointA1, aPointA2, aPointA3 ); aDataMap[ HYDROGUI_PrsImage::PointB ] = - HYDROGUI_ImportImageDlg::TransformationData( aPointB1, aPointB2 ); + HYDROGUI_ImportImageDlg::TransformationData( aPointB1, aPointB2, aPointB3 ); aDataMap[ HYDROGUI_PrsImage::PointC ] = - HYDROGUI_ImportImageDlg::TransformationData( aPointC1, aPointC2 ); - ( (HYDROGUI_ImportImageDlg*)inputPanel() )->setTransformationDataMap( aDataMap ); + HYDROGUI_ImportImageDlg::TransformationData( aPointC1, aPointC2, aPointC3 ); + aPanel->setTransformationDataMap( aDataMap ); } } @@ -117,22 +125,24 @@ void HYDROGUI_ImportImageOp::startOperation() QPoint aPointA1, aPointB1, aPointC1; QPointF aPointA2, aPointB2, aPointC2; + QPointF aPointA3, aPointB3, aPointC3; anImageObj->TrsfPoints( aPointA1, aPointB1, aPointC1, - aPointA2, aPointB2, aPointC2 ); + aPointA2, aPointB2, aPointC2, + aPointA3, aPointB3, aPointC3 ); HYDROGUI_ImportImageDlg::TransformationDataMap aDataMap; aDataMap[ HYDROGUI_PrsImage::PointA ] = - HYDROGUI_ImportImageDlg::TransformationData( aPointA1, aPointA2 ); + HYDROGUI_ImportImageDlg::TransformationData( aPointA1, aPointA2, aPointA3 ); aDataMap[ HYDROGUI_PrsImage::PointB ] = - HYDROGUI_ImportImageDlg::TransformationData( aPointB1, aPointB2 ); + HYDROGUI_ImportImageDlg::TransformationData( aPointB1, aPointB2, aPointB3 ); aDataMap[ HYDROGUI_PrsImage::PointC ] = - HYDROGUI_ImportImageDlg::TransformationData( aPointC1, aPointC2 ); + HYDROGUI_ImportImageDlg::TransformationData( aPointC1, aPointC2, aPointC3 ); HYDROGUI_ImportImageDlg::PrsPointData aPrsPointData( anImageObj->GetName(), aDataMap ); aPrsPointDataList.append( aPrsPointData ); } } - ( (HYDROGUI_ImportImageDlg*)inputPanel() )->setPrsPointDataList( aPrsPointDataList ); + aPanel->setPrsPointDataList( aPrsPointDataList ); } void HYDROGUI_ImportImageOp::abortOperation() @@ -158,6 +168,8 @@ HYDROGUI_InputPanel* HYDROGUI_ImportImageOp::createInputPanel() const this, SLOT( onActivatePointSelection( int ) ) ); connect( aPanel, SIGNAL( pointCoordChanged( bool, int, bool, int ) ), this, SLOT( onPointCoordChanged( bool, int, bool, int ) ) ); + connect( aPanel, SIGNAL( modeActivated( int ) ), + this, SLOT( onModeActivated( int ) ) ); connect( aPanel, SIGNAL( refImageActivated( const QString& ) ), this, SLOT( onRefImageActivated( const QString& ) ) ); return aPanel; @@ -183,21 +195,8 @@ bool HYDROGUI_ImportImageOp::processApply( int& theUpdateFlags, } } - if( !myPreviewPrs ) - return false; - - QImage anImage = myPreviewPrs->getImage(); - - bool anIsRefImage = aPanel->getTransformationMode() == HYDROGUI_ImportImageDlg::RefImage; - - QTransform aRefTransform; - if( anIsRefImage && myRefPreviewPrs ) - { - Handle(HYDROData_Image) aRefImageObj = - Handle(HYDROData_Image)::DownCast( myRefPreviewPrs->getObject() ); - if( !aRefImageObj.IsNull() ) - aRefTransform = aRefImageObj->Trsf(); - } + int aTransformationMode = aPanel->getTransformationMode(); + bool anIsRefImage = aTransformationMode == HYDROGUI_ImportImageDlg::RefImage; HYDROGUI_ImportImageDlg::TransformationDataMap aMap; if( !aPanel->getTransformationDataMap( aMap ) ) @@ -207,60 +206,65 @@ bool HYDROGUI_ImportImageOp::processApply( int& theUpdateFlags, if( anIsRefImage && !aPanel->getTransformationDataMap( aRefMap, true ) ) return false; - QPoint aPointA1 = aMap[ HYDROGUI_PrsImage::PointA ].first; - QPoint aPointB1 = aMap[ HYDROGUI_PrsImage::PointB ].first; - QPoint aPointC1 = aMap[ HYDROGUI_PrsImage::PointC ].first; + QPoint aPointA = aMap[ HYDROGUI_PrsImage::PointA ].ImagePoint; + QPoint aPointB = aMap[ HYDROGUI_PrsImage::PointB ].ImagePoint; + QPoint aPointC = aMap[ HYDROGUI_PrsImage::PointC ].ImagePoint; - QPointF aPointA2 = aMap[ HYDROGUI_PrsImage::PointA ].second; - QPointF aPointB2 = aMap[ HYDROGUI_PrsImage::PointB ].second; - QPointF aPointC2 = aMap[ HYDROGUI_PrsImage::PointC ].second; + QPointF aLPointA = aMap[ HYDROGUI_PrsImage::PointA ].LambertPoint; + QPointF aLPointB = aMap[ HYDROGUI_PrsImage::PointB ].LambertPoint; + QPointF aLPointC = aMap[ HYDROGUI_PrsImage::PointC ].LambertPoint; - QPoint aPointA3, aPointB3, aPointC3; + QPointF aCPointA = aMap[ HYDROGUI_PrsImage::PointA ].CartesianPoint; + QPointF aCPointB = aMap[ HYDROGUI_PrsImage::PointB ].CartesianPoint; + QPointF aCPointC = aMap[ HYDROGUI_PrsImage::PointC ].CartesianPoint; + + QPoint aRefPointA, aRefPointB, aRefPointC; if( anIsRefImage ) { - aPointA3 = aRefMap[ HYDROGUI_PrsImage::PointA ].first; - aPointB3 = aRefMap[ HYDROGUI_PrsImage::PointB ].first; - aPointC3 = aRefMap[ HYDROGUI_PrsImage::PointC ].first; + aRefPointA = aRefMap[ HYDROGUI_PrsImage::PointA ].ImagePoint; + aRefPointB = aRefMap[ HYDROGUI_PrsImage::PointB ].ImagePoint; + aRefPointC = aRefMap[ HYDROGUI_PrsImage::PointC ].ImagePoint; } - int xa1 = aPointA1.x(); - int ya1 = aPointA1.y(); - int xb1 = aPointB1.x(); - int yb1 = aPointB1.y(); - int xc1 = aPointC1.x(); - int yc1 = aPointC1.y(); - - double xa2 = aPointA2.x(); - double ya2 = aPointA2.y(); - double xb2 = aPointB2.x(); - double yb2 = aPointB2.y(); - double xc2 = aPointC2.x(); - double yc2 = aPointC2.y(); - - int xa3 = aPointA3.x(); - int ya3 = aPointA3.y(); - int xb3 = aPointB3.x(); - int yb3 = aPointB3.y(); - int xc3 = aPointC3.x(); - int yc3 = aPointC3.y(); + int xa = aPointA.x(); + int ya = aPointA.y(); + int xb = aPointB.x(); + int yb = aPointB.y(); + int xc = aPointC.x(); + int yc = aPointC.y(); + + double xca = aCPointA.x(); + double yca = aCPointA.y(); + double xcb = aCPointB.x(); + double ycb = aCPointB.y(); + double xcc = aCPointC.x(); + double ycc = aCPointC.y(); + + int xra = aRefPointA.x(); + int yra = aRefPointA.y(); + int xrb = aRefPointB.x(); + int yrb = aRefPointB.y(); + int xrc = aRefPointC.x(); + int yrc = aRefPointC.y(); // first, check that three input points don't belong to a single line - if( ( yb1 - ya1 ) * ( xc1 - xa1 ) == ( yc1 - ya1 ) * ( xb1 - xa1 ) ) + if( ( yb - ya ) * ( xc - xa ) == ( yc - ya ) * ( xb - xa ) ) { theErrorMsg = tr( "POINTS_A_B_C_BELONG_TO_SINGLE_LINE" ); return false; } // the same check for the reference points - if( anIsRefImage && ( ( yb3 - ya3 ) * ( xc3 - xa3 ) == ( yc3 - ya3 ) * ( xb3 - xa3 ) ) ) + if( anIsRefImage && + ( ( yrb - yra ) * ( xrc - xra ) == ( yrc - yra ) * ( xrb - xra ) ) ) { theErrorMsg = tr( "REFERENCE_POINTS_A_B_C_BELONG_TO_SINGLE_LINE" ); return false; } - QTransform aTransform1( xa1, ya1, 1, xb1, yb1, 1, xc1, yc1, 1 ); - QTransform aTransform2( xa2, ya2, 1, xb2, yb2, 1, xc2, yc2, 1 ); - QTransform aTransform3( xa3, ya3, 1, xb3, yb3, 1, xc3, yc3, 1 ); + QTransform aTransform1( xa, ya, 1, xb, yb, 1, xc, yc, 1 ); + QTransform aTransform2( xca, yca, 1, xcb, ycb, 1, xcc, ycc, 1 ); + QTransform aTransform3( xra, yra, 1, xrb, yrb, 1, xrc, yrc, 1 ); bool anIsInvertible = false; QTransform aTransform1Inverted = aTransform1.inverted( &anIsInvertible ); @@ -272,7 +276,7 @@ bool HYDROGUI_ImportImageOp::processApply( int& theUpdateFlags, QTransform aTransform; if( anIsRefImage ) - aTransform = aTransform1Inverted * aTransform3 * aRefTransform; + aTransform = aTransform1Inverted * aTransform3 * myRefTransform; else aTransform = aTransform1Inverted * aTransform2; @@ -287,19 +291,45 @@ bool HYDROGUI_ImportImageOp::processApply( int& theUpdateFlags, anImageObj->SetName( anImageName ); - anImageObj->SetImage( anImage ); + anImageObj->SetImage( myImage ); anImageObj->SetTrsf( aTransform ); if( anIsRefImage ) { - aPointA2 = QPointF( aTransform.map( aPointA1 ) ); - aPointB2 = QPointF( aTransform.map( aPointB1 ) ); - aPointC2 = QPointF( aTransform.map( aPointC1 ) ); + aCPointA = QPointF( aTransform.map( aPointA ) ); + aCPointB = QPointF( aTransform.map( aPointB ) ); + aCPointC = QPointF( aTransform.map( aPointC ) ); + + // compute Lambert93 points + xca = aCPointA.x(); + yca = aCPointA.y(); + xcb = aCPointB.x(); + ycb = aCPointB.y(); + xcc = aCPointC.x(); + ycc = aCPointC.y(); + + double xla = 0, yla = 0, xlb = 0, ylb = 0, xlc = 0, ylc = 0; + HYDROData_Lambert93::toGeo( xca, yca, yla, xla ); + HYDROData_Lambert93::toGeo( xcb, ycb, ylb, xlb ); + HYDROData_Lambert93::toGeo( xcc, ycc, ylc, xlc ); + + aLPointA = QPointF( xla * 3600.0, yla * 3600.0 ); // convert degrees to seconds + aLPointB = QPointF( xlb * 3600.0, ylb * 3600.0 ); // convert degrees to seconds + aLPointC = QPointF( xlc * 3600.0, ylc * 3600.0 ); // convert degrees to seconds } - anImageObj->SetTrsfPoints( aPointA1, aPointB1, aPointC1, - aPointA2, aPointB2, aPointC2 ); + anImageObj->SetTrsfMode( aTransformationMode ); + anImageObj->SetTrsfPoints( aPointA, aPointB, aPointC, + aLPointA, aLPointB, aLPointC, + aCPointA, aCPointB, aCPointC ); + if( !myIsEdit ) + { + // Set imported file name for image + QString aFilePath = aPanel->getFileName(); + anImageObj->SetFilePath( aFilePath ); + } + // must be done after all checks and before calling SetVisible() method below closePreview(); @@ -307,58 +337,82 @@ bool HYDROGUI_ImportImageOp::processApply( int& theUpdateFlags, module()->setObjectVisible( HYDROGUI_Tool::GetActiveGraphicsViewId( module() ), anImageObj, true ); if( myIsEdit ) - if( HYDROOperations_Factory* aFactory = HYDROOperations_Factory::Factory() ) - aFactory->UpdateImage( doc(), anImageObj ); + anImageObj->Update(); - theUpdateFlags = UF_Model | UF_Viewer | UF_GV_Forced; + theUpdateFlags = UF_Model | UF_Viewer | UF_GV_Forced | UF_OCCViewer | UF_OCC_Forced; return true; } void HYDROGUI_ImportImageOp::onCreatePreview( QImage theImage ) { - LightApp_Application* anApp = module()->getApp(); + HYDROGUI_ImportImageDlg* aPanel = (HYDROGUI_ImportImageDlg*)inputPanel(); - myActiveViewManager = anApp->activeViewManager(); + myImage = theImage; - myPreviewPrs = new HYDROGUI_PrsImage( myIsEdit ? myEditedObject : 0 ); - myPreviewPrs->setImage( theImage ); - myPreviewPrs->compute(); + if( myPreviewPrs ) // if the image is changed by choosing another file + { + myPreviewPrs->setImage( myImage ); + myPreviewPrs->compute(); - myPreviewViewManager = - dynamic_cast( anApp->createViewManager( GraphicsView_Viewer::Type() ) ); - if( myPreviewViewManager ) + if( myPreviewViewManager ) + { + if( GraphicsView_Viewer* aViewer = myPreviewViewManager->getViewer() ) + { + if( GraphicsView_ViewPort* aViewPort = aViewer->getActiveViewPort() ) + { + aViewPort->onBoundingRectChanged(); + aViewPort->fitAll(); + } + } + } + } + else { - module()->setViewManagerRole( myPreviewViewManager, HYDROGUI_Module::VMR_TransformImage ); - myPreviewViewManager->setTitle( tr( "TRANSFORM_IMAGE" ) ); - if( GraphicsView_Viewer* aViewer = myPreviewViewManager->getViewer() ) + LightApp_Application* anApp = module()->getApp(); + + myActiveViewManager = anApp->activeViewManager(); + + myPreviewPrs = new HYDROGUI_PrsImage( myIsEdit ? myEditedObject : 0 ); + myPreviewPrs->setImage( myImage ); + myPreviewPrs->compute(); + + myPreviewViewManager = + dynamic_cast( anApp->createViewManager( GraphicsView_Viewer::Type() ) ); + if( myPreviewViewManager ) { - if( GraphicsView_ViewPort* aViewPort = aViewer->getActiveViewPort() ) + connect( myPreviewViewManager, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ), + this, SLOT( onLastViewClosed( SUIT_ViewManager* ) ) ); + + module()->setViewManagerRole( myPreviewViewManager, HYDROGUI_Module::VMR_TransformImage ); + myPreviewViewManager->setTitle( tr( "TRANSFORM_IMAGE" ) ); + if( GraphicsView_Viewer* aViewer = myPreviewViewManager->getViewer() ) { - //aViewPort->setMousePositionEnabled( true ); //ouv: temporarily commented + if( GraphicsView_ViewPort* aViewPort = aViewer->getActiveViewPort() ) + { + //aViewPort->setMousePositionEnabled( true ); //ouv: temporarily commented - aViewPort->addItem( myPreviewPrs ); - aViewPort->fitAll(); + aViewPort->addItem( myPreviewPrs ); + aViewPort->fitAll(); - myPreviewPrs->setIsTransformationPointPreview( true ); + myPreviewPrs->setIsTransformationPointPreview( true ); + } + connect( aViewer, SIGNAL( selectionChanged( GV_SelectionChangeStatus ) ), + this, SLOT( onPointSelected() ) ); } - connect( aViewer, SIGNAL( selectionChanged( GV_SelectionChangeStatus ) ), - this, SLOT( onPointSelected() ) ); } - } - HYDROGUI_ImportImageDlg* aPanel = (HYDROGUI_ImportImageDlg*)inputPanel(); - - QString anImageName; - if( myIsEdit ) - { - if( !myEditedObject.IsNull() ) - anImageName = myEditedObject->GetName(); + QString anImageName; + if( myIsEdit ) + { + if( !myEditedObject.IsNull() ) + anImageName = myEditedObject->GetName(); + } + else + anImageName = HYDROGUI_Tool::GenerateObjectName( module(), "Image" ); + aPanel->setImageName( anImageName ); } - else - anImageName = HYDROGUI_Tool::GenerateObjectName( module(), "Image" ); - aPanel->setImageName( anImageName ); - aPanel->setImageSize( theImage.size() ); + aPanel->setImageSize( myImage.size() ); aPanel->initializePointSelection(); onPointSelected( false ); @@ -384,8 +438,24 @@ void HYDROGUI_ImportImageOp::onPointCoordChanged( bool theIsRef, myRefPreviewPrs->updateTransformationPoint( thePointType, theIsY, theValue ); } +void HYDROGUI_ImportImageOp::onModeActivated( int theMode ) +{ + HYDROGUI_ImportImageDlg* aPanel = (HYDROGUI_ImportImageDlg*)inputPanel(); + + QString aRefImageName; + if( theMode == HYDROGUI_ImportImageDlg::RefImage ) + { + aRefImageName = aPanel->getRefImageName(); + if( aRefImageName.isEmpty() ) + return; // do nothing in this case to avoid visual moving of preview prs + } + onRefImageActivated( aRefImageName ); +} + void HYDROGUI_ImportImageOp::onRefImageActivated( const QString& theName ) { + myRefTransform.reset(); + GraphicsView_ViewPort* aViewPort = 0; if( myPreviewViewManager ) if( GraphicsView_Viewer* aViewer = myPreviewViewManager->getViewer() ) @@ -412,6 +482,7 @@ void HYDROGUI_ImportImageOp::onRefImageActivated( const QString& theName ) if( !anImageObj.IsNull() ) { anImage = anImageObj->Image(); + myRefTransform = anImageObj->Trsf(); myRefPreviewPrs = new HYDROGUI_PrsImage( anImageObj ); myRefPreviewPrs->setImage( anImage ); @@ -443,6 +514,11 @@ void HYDROGUI_ImportImageOp::onRefImageActivated( const QString& theName ) onPointSelected( true ); } +void HYDROGUI_ImportImageOp::onLastViewClosed( SUIT_ViewManager* theViewManager ) +{ + closePreview(); +} + void HYDROGUI_ImportImageOp::onPointSelected() { onPointSelected( myRefPreviewPrs && myRefPreviewPrs->isSelected() ); @@ -465,7 +541,7 @@ void HYDROGUI_ImportImageOp::onPointSelected( bool theIsRefImage ) const HYDROGUI_PrsImage::TransformationPoint& aTransformationPoint = anIter.value(); const QPoint& aPoint = aTransformationPoint.Point; - HYDROGUI_ImportImageDlg::TransformationData aData( aPoint, QPointF() ); + HYDROGUI_ImportImageDlg::TransformationData aData( aPoint, QPointF(), QPointF() ); aDataMap[ aPointType ] = aData; } @@ -474,6 +550,14 @@ void HYDROGUI_ImportImageOp::onPointSelected( bool theIsRefImage ) void HYDROGUI_ImportImageOp::closePreview() { + // It's very strange, but without calling this method (it's quite safe) a crash is stably reproduced. + // Scenario: create any non-Graphics view, activate import op, click apply. + // Result: a few SIGSEGVs coming from processEvents(), then crash. + if( myPreviewViewManager ) + if( GraphicsView_Viewer* aViewer = myPreviewViewManager->getViewer() ) + if( GraphicsView_ViewPort* aViewPort = aViewer->getActiveViewPort() ) + aViewPort->onBoundingRectChanged(); + if( myPreviewPrs ) { delete myPreviewPrs; @@ -488,6 +572,9 @@ void HYDROGUI_ImportImageOp::closePreview() if( myPreviewViewManager ) { + disconnect( myPreviewViewManager, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ), + this, SLOT( onLastViewClosed( SUIT_ViewManager* ) ) ); + module()->getApp()->removeViewManager( myPreviewViewManager ); // myPreviewViewManager is deleted here myPreviewViewManager = 0; }