+QStringList HYDROData_Image::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
+{
+ QStringList aResList;
+
+ Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( this );
+ if ( aDocument.IsNull() )
+ return aResList;
+
+ QString aDocName = aDocument->GetDocPyName();
+ QString anImageName = GetName();
+
+ aResList << QString( "%1 = %2.CreateObject( %3 );" )
+ .arg( anImageName ).arg( aDocName ).arg( PYTHON_IMAGE_ID );
+ aResList << QString( "%1.SetName( \"%2\" );" )
+ .arg( anImageName ).arg( anImageName );
+
+ QString aFilePath = GetFilePath();
+ if ( !aFilePath.isEmpty() )
+ {
+ aResList << QString( "" );
+ aResList << QString( "%1.LoadImage( \"%2\" );" )
+ .arg( anImageName ).arg( aFilePath );
+
+ // Dump transformation matrix for image
+ aResList << QString( "" );
+
+ QTransform aTrsf = Trsf();
+
+ aResList << QString( "trsf = QTransform( %1, %2, %3," )
+ .arg( aTrsf.m11() ).arg( aTrsf.m12() ).arg( aTrsf.m13() );
+ aResList << QString( " %1, %2, %3," )
+ .arg( aTrsf.m21() ).arg( aTrsf.m22() ).arg( aTrsf.m23() );
+ aResList << QString( " %1, %2, %3 );" )
+ .arg( aTrsf.m31() ).arg( aTrsf.m32() ).arg( aTrsf.m33() );
+
+ aResList << QString( "%1.SetTrsf( trsf );" ).arg( anImageName );
+
+ // Dump transformation points for image
+ aResList << QString( "" );
+
+ QPoint aPointA, aPointB, aPointC;
+ QPointF aLambertPointA, aLambertPointB, aLambertPointC;
+ QPointF aCartesianPointA, aCartesianPointB, aCartesianPointC;
+ TrsfPoints( aPointA, aPointB, aPointC,
+ aLambertPointA, aLambertPointB, aLambertPointC,
+ aCartesianPointA, aCartesianPointB, aCartesianPointC );
+
+ aResList << QString( "pa = QPoint( %1, %2 );" )
+ .arg( aPointA.x() ).arg( aPointA.y() );
+
+ aResList << QString( "pb = QPoint( %1, %2 );" )
+ .arg( aPointB.x() ).arg( aPointB.y() );
+
+ aResList << QString( "pc = QPoint( %1, %2 );" )
+ .arg( aPointC.x() ).arg( aPointC.y() );
+
+ aResList << QString( "lpa = QPointF( %1, %2 );" )
+ .arg( aLambertPointA.x() ).arg( aLambertPointA.y() );
+
+ aResList << QString( "lpb = QPointF( %1, %2 );" )
+ .arg( aLambertPointB.x() ).arg( aLambertPointB.y() );
+
+ aResList << QString( "lpc = QPointF( %1, %2 );" )
+ .arg( aLambertPointC.x() ).arg( aLambertPointC.y() );
+
+ aResList << QString( "cpa = QPointF( %1, %2 );" )
+ .arg( aCartesianPointA.x() ).arg( aCartesianPointA.y() );
+
+ aResList << QString( "cpb = QPointF( %1, %2 );" )
+ .arg( aCartesianPointB.x() ).arg( aCartesianPointB.y() );
+
+ aResList << QString( "cpc = QPointF( %1, %2 );" )
+ .arg( aCartesianPointC.x() ).arg( aCartesianPointC.y() );
+
+ QString aGap = QString().fill( ' ', anImageName.size() + 16 );
+ aResList << QString( "%1.SetTrsfPoints( pa, pb, pc," ).arg( anImageName );
+ aResList << QString( aGap + "lpa, lpb, lpc," );
+ aResList << QString( aGap + "cpa, cpb, cpc );" );
+ }
+ else
+ {
+ // Image is composed from other image(s)
+
+ QString anOperatorName = OperatorName();
+ if ( !anOperatorName.isEmpty() )
+ {
+ aResList << QString( "" );
+
+ aResList << QString( "%1.SetOperatorName( \"%2\" );" )
+ .arg( anImageName ).arg( anOperatorName );
+
+ ImageComposer_Operator* anImageOp = HYDROData_OperationsFactory::Factory()->Operator( this );
+ if ( anImageOp )
+ {
+ // Dump operation arguments
+ QString anOpArgsArrayName;
+ QStringList anOpArgs = anImageOp->dumpArgsToPython( anOpArgsArrayName );
+ if ( !anOpArgs.isEmpty() )
+ {
+ aResList << QString( "" );
+ aResList << anOpArgs;
+
+ aResList << QString( "" );
+ aResList << QString( "%1.SetArgs( %2 );" )
+ .arg( anImageName ).arg( anOpArgsArrayName );
+ }
+ }
+ }
+
+ int aNbReferences = NbReferences();
+ if ( aNbReferences > 0 )
+ {
+ aResList << QString( "" );
+
+ for ( int i = 0; i < aNbReferences; ++i )
+ {
+ Handle(HYDROData_Image) aRefImg = Handle(HYDROData_Image)::DownCast( Reference( i ) );
+ setPythonReferenceObject( theTreatedObjects, aResList, aRefImg, "AppendReference" );
+ }
+ }
+
+ // Necessary to update image in case of composed operator
+ aResList << QString( "" );
+ aResList << QString( "%1.Update( False );" ).arg( anImageName );
+ }
+
+ return aResList;
+}
+
+void HYDROData_Image::Update( const bool theIsForce )
+{
+ HYDROData_OperationsFactory* aFactory = HYDROData_OperationsFactory::Factory();
+
+ // Update image only if there is an operation
+ ImageComposer_Operator* anOp = aFactory->Operator( OperatorName() );
+ if ( anOp )
+ {
+ // Fill by arguments and process the operation
+ QVariant anObj1, anObj2;
+ int aNbReferences = NbReferences();
+
+ if ( aNbReferences > 0 )
+ {
+ // First referenced object
+ Handle(HYDROData_Entity) aRefObj = Reference( 0 );
+ if ( !aRefObj.IsNull() )
+ {
+ anObj1 = aRefObj->GetDataVariant();
+ if ( !anObj1.isNull() && anObj1.canConvert<ImageComposer_Image>() )
+ {
+ ImageComposer_Image anImage = anObj1.value<ImageComposer_Image>();
+ QTransform aTransform = anImage.transform();
+ SetTrsf( aTransform );
+ }
+ }
+ }
+
+ if ( aNbReferences > 1 )
+ {
+ // Second referenced object
+ Handle(HYDROData_Entity) aRefObj = Reference( 1 );
+ if ( !aRefObj.IsNull() )
+ anObj2 = aRefObj->GetDataVariant();
+ }
+
+ ImageComposer_Image aResImg = anOp->process( anObj1, anObj2 );
+ SetImage( aResImg );
+ }
+
+ if ( theIsForce )
+ {
+ Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( this );
+ if ( !aDocument.IsNull() )
+ {
+ // Change the states of this and all depended images
+ MustBeUpdated( true );
+ HYDROData_Tool::SetMustBeUpdatedImages( aDocument );
+ MustBeUpdated( false );
+ }
+ }
+}
+
+QVariant HYDROData_Image::GetDataVariant()
+{
+ QTransform aTransform = Trsf();
+
+ ImageComposer_Image anImage = Image();
+ anImage.setTransform( aTransform );
+
+ QVariant aVarData;
+ aVarData.setValue<ImageComposer_Image>( anImage );
+
+ return aVarData;
+}
+