X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_ImportImageOp.cxx;h=4f7afb9b2e0fd6009a2a7324a80ca2da9c650e57;hb=de7cf9bb0a7a41d6487013c87f4a54d0664cd303;hp=d53d3a8bb997ebc3d37fb2c39bb4971e4c8225b7;hpb=90314a195b4d4951ba61a7333cb0de16c253dea9;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_ImportImageOp.cxx b/src/HYDROGUI/HYDROGUI_ImportImageOp.cxx index d53d3a8b..4f7afb9b 100644 --- a/src/HYDROGUI/HYDROGUI_ImportImageOp.cxx +++ b/src/HYDROGUI/HYDROGUI_ImportImageOp.cxx @@ -30,8 +30,6 @@ #include "HYDROGUI_UpdateFlags.h" #include -#include -#include #include #include @@ -86,78 +84,88 @@ void HYDROGUI_ImportImageOp::startOperation() QPoint aLocalPointA, aLocalPointB, aLocalPointC; myEditedObject->GetLocalPoints( aLocalPointA, aLocalPointB, aLocalPointC ); + // Create the edited image preview presentation in the viewer onCreatePreview( anImage ); - if( myPreviewPrs ) + // Set transformation local points A,B,C to the image preview presentation + setPresentationTrsfPoints( myPreviewPrs, anIsByTwoPoints, aLocalPointA, + aLocalPointB, aLocalPointC ); + + // Build the existing image local and global points mapping + // according to the current transformation mode. + HYDROData_Image::TransformationMode aTrsfMode = myEditedObject->GetTrsfMode(); + QPointF aTrsfPointA, aTrsfPointB, aTrsfPointC; + HYDROGUI_ImportImageDlg::TransformationDataMap aDataMap; + if ( aTrsfMode == HYDROData_Image::ReferenceImage ) { - HYDROGUI_PrsImage::TransformationPointMap aPointMap = - myPreviewPrs->getTransformationPointMap(); - if( !aPointMap.isEmpty() ) + // Compute global points using the transformation matrix of the reference image + Handle(HYDROData_Image) aRefImage = myEditedObject->GetTrsfReferenceImage(); + if ( !aRefImage.IsNull() ) { - aPointMap[ HYDROGUI_PrsImage::PointA ].Point = aLocalPointA; - aPointMap[ HYDROGUI_PrsImage::PointB ].Point = aLocalPointB; + QTransform aRefTrsf = aRefImage->Trsf(); // The reference image transformation matrix + aTrsfPointA = aRefTrsf.map( aLocalPointA ); // Compute the global point A + aTrsfPointB = aRefTrsf.map( aLocalPointB ); // Compute the global point B if ( !anIsByTwoPoints ) - aPointMap[ HYDROGUI_PrsImage::PointC ].Point = aLocalPointC; - - myPreviewPrs->setTransformationPointMap( aPointMap ); + { + aTrsfPointC = aRefTrsf.map( aLocalPointC ); // Compute the global point C if used + } + // Build the local-global points map + // Use the reference image transformation mode for interpreting global points + computeTrsfData( aRefImage->GetTrsfMode(), anIsByTwoPoints, aLocalPointA, aLocalPointB, aLocalPointC, + aTrsfPointA, aTrsfPointB, aTrsfPointC, aDataMap ); } } + else + { + // Get global points from the edited image + myEditedObject->GetGlobalPoints( aTrsfMode, aTrsfPointA, aTrsfPointB, aTrsfPointC ); + // Build the local-global points map + computeTrsfData( aTrsfMode, anIsByTwoPoints, aLocalPointA, aLocalPointB, aLocalPointC, + aTrsfPointA, aTrsfPointB, aTrsfPointC, aDataMap ); + } - HYDROData_Image::TransformationMode aTrsfMode; - QPointF aTrsfPointA, aTrsfPointB, aTrsfPointC; - myEditedObject->GetGlobalPoints( aTrsfMode, - aTrsfPointA, aTrsfPointB, aTrsfPointC ); - - HYDROGUI_ImportImageDlg::TransformationDataMap aDataMap; - aDataMap[ HYDROGUI_PrsImage::PointA ] = - HYDROGUI_ImportImageDlg::ComputeTrsfData( aTrsfMode, aLocalPointA, aTrsfPointA ); - aDataMap[ HYDROGUI_PrsImage::PointB ] = - HYDROGUI_ImportImageDlg::ComputeTrsfData( aTrsfMode, aLocalPointB, aTrsfPointB ); - if ( !anIsByTwoPoints ) - aDataMap[ HYDROGUI_PrsImage::PointC ] = - HYDROGUI_ImportImageDlg::ComputeTrsfData( aTrsfMode, aLocalPointC, aTrsfPointC ); - + // Initialize the dialog mode, local and global coordinates + // except coordinates on the reference image aPanel->setTransformationMode( aTrsfMode ); aPanel->setTransformationDataMap( aDataMap ); aPanel->setByTwoPoints( anIsByTwoPoints ); - // Set points on reference image - if ( aTrsfMode = HYDROData_Image::ReferenceImage ) + // Set points of the reference image + if ( aTrsfMode == HYDROData_Image::ReferenceImage ) { - Handle(HYDROData_Image) aRefImage = myEditedObject->GetTrsfReferenceImage(); + Handle(HYDROData_Image) aRefImage; + myEditedObject->GetReferencePoints( aRefImage, + aTrsfPointA, aTrsfPointB, aTrsfPointC ); if ( !aRefImage.IsNull() ) { aRefImageName = aRefImage->GetName(); + // Create the reference image presentation in the viewer onRefImageActivated( aRefImageName ); - if( myRefPreviewPrs ) - { - HYDROGUI_PrsImage::TransformationPointMap aRefPointMap = - myRefPreviewPrs->getTransformationPointMap(); - if( !aRefPointMap.isEmpty() ) - { - aRefPointMap[ HYDROGUI_PrsImage::PointA ].Point = aTrsfPointA.toPoint(); - aRefPointMap[ HYDROGUI_PrsImage::PointB ].Point = aTrsfPointB.toPoint(); - if ( !anIsByTwoPoints ) - aRefPointMap[ HYDROGUI_PrsImage::PointC ].Point = aTrsfPointC.toPoint(); - - myRefPreviewPrs->setTransformationPointMap( aRefPointMap ); - } - } + // Set transformation points A,B,C to the reference image presentation + setPresentationTrsfPoints( myRefPreviewPrs, anIsByTwoPoints, aTrsfPointA.toPoint(), + aTrsfPointB.toPoint(), aTrsfPointC.toPoint() ); + + // Prepare A, B, C points on the reference image HYDROGUI_ImportImageDlg::TransformationDataMap aRefDataMap; - aRefDataMap[ HYDROGUI_PrsImage::PointA ] = HYDROGUI_ImportImageDlg::TransformationData( aTrsfPointA.toPoint() ); - aRefDataMap[ HYDROGUI_PrsImage::PointB ] = HYDROGUI_ImportImageDlg::TransformationData( aTrsfPointB.toPoint() ); + aRefDataMap[ HYDROGUI_PrsImage::PointA ] = + HYDROGUI_ImportImageDlg::TransformationData( aTrsfPointA.toPoint() ); + aRefDataMap[ HYDROGUI_PrsImage::PointB ] = + HYDROGUI_ImportImageDlg::TransformationData( aTrsfPointB.toPoint() ); if ( !anIsByTwoPoints ) - aRefDataMap[ HYDROGUI_PrsImage::PointC ] = HYDROGUI_ImportImageDlg::TransformationData( aTrsfPointC.toPoint() ); + aRefDataMap[ HYDROGUI_PrsImage::PointC ] = + HYDROGUI_ImportImageDlg::TransformationData( aTrsfPointC.toPoint() ); + // Initialize the dialog's A, B, C points coordinates of the reference image aPanel->setTransformationDataMap( aRefDataMap, true, true ); } } } } - // collect information about existing images + // Collect information about existing images and initialize the combobox + // reference image selector in the dialog. HYDROGUI_ImportImageDlg::PrsPointDataList aPrsPointDataList; HYDROData_Iterator anIterator( doc(), KIND_IMAGE ); for( ; anIterator.More(); anIterator.Next() ) @@ -177,22 +185,67 @@ void HYDROGUI_ImportImageOp::startOperation() aTrsfPointA, aTrsfPointB, aTrsfPointC ); HYDROGUI_ImportImageDlg::TransformationDataMap aDataMap; - aDataMap[ HYDROGUI_PrsImage::PointA ] = - HYDROGUI_ImportImageDlg::ComputeTrsfData( aImgTrsfMode, aLocalPointA, aTrsfPointA ); - aDataMap[ HYDROGUI_PrsImage::PointB ] = - HYDROGUI_ImportImageDlg::ComputeTrsfData( aImgTrsfMode, aLocalPointB, aTrsfPointB ); - aDataMap[ HYDROGUI_PrsImage::PointC ] = - HYDROGUI_ImportImageDlg::ComputeTrsfData( aImgTrsfMode, aLocalPointC, aTrsfPointC ); + computeTrsfData( aImgTrsfMode, false, aLocalPointA, aLocalPointB, aLocalPointC, + aTrsfPointA, aTrsfPointB, aTrsfPointC, aDataMap ); HYDROGUI_ImportImageDlg::PrsPointData aPrsPointData( anImageObj->GetName(), aDataMap ); aPrsPointDataList.append( aPrsPointData ); } } + // Initialize the combobox in the dialog with the list of available reference images aPanel->setPrsPointDataList( aPrsPointDataList ); + // Select the current reference image in the dialog combobox aPanel->setRefImageName( aRefImageName ); } +void HYDROGUI_ImportImageOp::setPresentationTrsfPoints( HYDROGUI_PrsImage* thePrs, + bool theIsByTwoPoints, + const QPoint theLocalPointA, + const QPoint theLocalPointB, + const QPoint theLocalPointC ) +{ + // Set transformation points A,B,C to the image presentation + if( thePrs ) + { + HYDROGUI_PrsImage::TransformationPointMap aPointMap = + thePrs->getTransformationPointMap(); + if( !aPointMap.isEmpty() ) + { + aPointMap[ HYDROGUI_PrsImage::PointA ].Point = theLocalPointA; + aPointMap[ HYDROGUI_PrsImage::PointB ].Point = theLocalPointB; + if ( !theIsByTwoPoints ) + aPointMap[ HYDROGUI_PrsImage::PointC ].Point = theLocalPointC; + + thePrs->setIsByTwoPoints( theIsByTwoPoints ); + thePrs->setTransformationPointMap( aPointMap ); + } + } +} + +void HYDROGUI_ImportImageOp::computeTrsfData( HYDROData_Image::TransformationMode theTrsfMode, + bool theIsByTwoPoints, + const QPoint& theLocalPointA, + const QPoint& theLocalPointB, + const QPoint& theLocalPointC, + const QPointF& theGlobalPointA, + const QPointF& theGlobalPointB, + const QPointF& theGlobalPointC, + HYDROGUI_ImportImageDlg::TransformationDataMap& theDataMap ) const +{ + // Build the local-global points map + HYDROGUI_ImportImageDlg::TransformationDataMap aDataMap; + theDataMap[ HYDROGUI_PrsImage::PointA ] = + HYDROGUI_ImportImageDlg::ComputeTrsfData( theTrsfMode, theLocalPointA, theGlobalPointA ); + theDataMap[ HYDROGUI_PrsImage::PointB ] = + HYDROGUI_ImportImageDlg::ComputeTrsfData( theTrsfMode, theLocalPointB, theGlobalPointB ); + if ( !theIsByTwoPoints ) + { + theDataMap[ HYDROGUI_PrsImage::PointC ] = + HYDROGUI_ImportImageDlg::ComputeTrsfData( theTrsfMode, theLocalPointC, theGlobalPointC ); + } +} + void HYDROGUI_ImportImageOp::abortOperation() { closePreview(); @@ -210,19 +263,29 @@ void HYDROGUI_ImportImageOp::commitOperation() HYDROGUI_InputPanel* HYDROGUI_ImportImageOp::createInputPanel() const { HYDROGUI_InputPanel* aPanel = new HYDROGUI_ImportImageDlg( module(), getName() ); - connect( aPanel, SIGNAL( createPreview( QImage ) ), - this, SLOT( onCreatePreview( QImage ) ) ); - connect( aPanel, SIGNAL( activatePointSelection( int ) ), - 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( createPreview( QImage ) ), SLOT( onCreatePreview( QImage ) ) ); + connect( aPanel, SIGNAL( activatePointSelection( int ) ), SLOT( onActivatePointSelection( int ) ) ); + connect( aPanel, SIGNAL( pointCoordChanged( bool, int, bool, int ) ), + SLOT( onPointCoordChanged( bool, int, bool, int ) ) ); + connect( aPanel, SIGNAL( modeActivated( int ) ), SLOT( onModeActivated( int ) ) ); connect( aPanel, SIGNAL( refImageActivated( const QString& ) ), - this, SLOT( onRefImageActivated( const QString& ) ) ); + SLOT( onRefImageActivated( const QString& ) ) ); + connect( aPanel, SIGNAL( setCIsUsed( bool ) ), SLOT( onSetCIsUsed( bool ) ) ); return aPanel; } +void HYDROGUI_ImportImageOp::onSetCIsUsed( bool theCIsUsed ) +{ + if ( myPreviewPrs ) + { + myPreviewPrs->setIsByTwoPoints( !theCIsUsed ); + } + if ( myRefPreviewPrs ) + { + myRefPreviewPrs->setIsByTwoPoints( !theCIsUsed ); + } +} + bool HYDROGUI_ImportImageOp::checkPoints( const QPointF& thePointA, const QPointF& thePointB, const QPointF& thePointC, @@ -349,12 +412,12 @@ bool HYDROGUI_ImportImageOp::processApply( int& theUpdateFlags, } else { - if ( aTransformationMode == HYDROData_Image::ManualLambert ) + if ( aTransformationMode == HYDROData_Image::ManualGeodesic ) { - aTrsfPointA = aMap[ HYDROGUI_PrsImage::PointA ].LambertPoint; - aTrsfPointB = aMap[ HYDROGUI_PrsImage::PointB ].LambertPoint; + aTrsfPointA = aMap[ HYDROGUI_PrsImage::PointA ].GeodesicPoint; + aTrsfPointB = aMap[ HYDROGUI_PrsImage::PointB ].GeodesicPoint; if ( !anIsByTwoPoints ) - aTrsfPointC = aMap[ HYDROGUI_PrsImage::PointC ].LambertPoint; + aTrsfPointC = aMap[ HYDROGUI_PrsImage::PointC ].GeodesicPoint; } else { @@ -474,7 +537,7 @@ void HYDROGUI_ImportImageOp::onCreatePreview( QImage theImage ) anImageName = myEditedObject->GetName(); } else - anImageName = HYDROGUI_Tool::GenerateObjectName( module(), "Image" ); + anImageName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_IMAGE_NAME" ) ); aPanel->setImageName( anImageName ); } @@ -559,7 +622,6 @@ void HYDROGUI_ImportImageOp::onRefImageActivated( const QString& theName ) } } } - qApp->processEvents(); if( !aViewPort ) return; @@ -598,6 +660,7 @@ void HYDROGUI_ImportImageOp::onRefImageActivated( const QString& theName ) // Split views horizontally if( anApp->desktop()->inherits( "STD_TabDesktop" ) ) { + qApp->processEvents(); QtxWorkstack* aWorkstack = ( (STD_TabDesktop*)anApp->desktop() )->workstack(); aViewPort->activateWindow(); aViewPort->show(); @@ -637,6 +700,7 @@ void HYDROGUI_ImportImageOp::onPointSelected( bool theIsRefImage ) const HYDROGUI_PrsImage::TransformationPointMap& aPointMap = aPrs->getTransformationPointMap(); + HYDROGUI_PrsImage::TransformationPointMapIterator anIter( aPointMap ); while( anIter.hasNext() ) {