#include "HYDROData_Image.h"
#include "HYDROData_Document.h"
+#include "HYDROData_Lambert93.h"
#include "HYDROData_Tool.h"
#include "HYDROData_OperationsFactory.h"
#include <QStringList>
-static const Standard_GUID GUID_MUST_BE_UPDATED("80f2bb81-3873-4631-8ddd-940d2119f000");
static const Standard_GUID GUID_SELF_SPLITTED("997995aa-5c19-40bf-9a60-ab4b70ad04d8");
static const Standard_GUID GUID_HAS_LOCAL_POINTS("FD8841AA-FC44-42fa-B6A7-0F682CCC6F27");
static const Standard_GUID GUID_HAS_GLOBAL_POINTS("330D0E81-742D-4ea3-92D4-484877CFA7C1");
{
QStringList aResList;
- Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( this );
+ Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
if ( aDocument.IsNull() )
return aResList;
aResList << QString( "%1.SetOperatorName( \"%2\" );" )
.arg( anImageName ).arg( anOperatorName );
- ImageComposer_Operator* anImageOp = HYDROData_OperationsFactory::Factory()->Operator( this );
+ ImageComposer_Operator* anImageOp =
+ HYDROData_OperationsFactory::Factory()->Operator( OperatorName() );
if ( anImageOp )
{
// Dump operation arguments
// Necessary to update image in case of composed operator
aResList << QString( "" );
- aResList << QString( "%1.Update( False );" ).arg( anImageName );
+ aResList << QString( "%1.Update();" ).arg( anImageName );
}
return aResList;
}
-void HYDROData_Image::Update( const bool theIsForce )
+void HYDROData_Image::Update()
{
HYDROData_OperationsFactory* aFactory = HYDROData_OperationsFactory::Factory();
- // Update image only if there is an operation
ImageComposer_Operator* anOp = aFactory->Operator( OperatorName() );
- if ( anOp )
+ if ( anOp ) // Update image if there is an operation
{
// Fill by arguments and process the operation
QVariant anObj1, anObj2;
ImageComposer_Image aResImg = anOp->process( anObj1, anObj2 );
SetImage( aResImg );
+ SetTrsf( aResImg.transform() );
+ }
+ else // Update image if it positioned relatively to other image
+ {
+ UpdateTrsf();
}
- if ( theIsForce )
+ Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
+ if ( !aDocument.IsNull() )
{
- 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 );
- }
+ // Change the states of this and all depended images
+ SetToUpdate( true );
+ HYDROData_Tool::SetMustBeUpdatedImages( aDocument );
+ SetToUpdate( false );
}
}
return aVarData;
}
+HYDROData_SequenceOfObjects HYDROData_Image::GetAllReferenceObjects() const
+{
+ HYDROData_SequenceOfObjects aResSeq = HYDROData_Entity::GetAllReferenceObjects();
+
+ Handle(HYDROData_Image) aRefImage = GetTrsfReferenceImage();
+ if ( !aRefImage.IsNull() )
+ aResSeq.Append( aRefImage );
+
+ HYDROData_SequenceOfObjects aSeqRefObjects = GetReferenceObjects( 0 );
+ aResSeq.Append( aSeqRefObjects );
+
+ return aResSeq;
+}
+
void HYDROData_Image::SetImage(const QImage& theImage)
{
if (theImage.isNull()) {
aRefTransform = aRefImage->Trsf();
}
+ bool anIsByTwoPoints = IsByTwoPoints();
+
+ // Convert lambert coordinates to cartesian
+ if ( aTrsfMode == ManualGeodesic )
+ {
+ double aXCart = 0, aYCart = 0;
+
+ HYDROData_Lambert93::toXY( aTrsfPointA.y(), aTrsfPointA.x(), aXCart, aYCart );
+ aTrsfPointA = QPointF( aXCart, aYCart );
+
+ HYDROData_Lambert93::toXY( aTrsfPointB.y(), aTrsfPointB.x(), aXCart, aYCart );
+ aTrsfPointB = QPointF( aXCart, aYCart );
+
+ if ( !anIsByTwoPoints )
+ {
+ HYDROData_Lambert93::toXY( aTrsfPointC.y(), aTrsfPointC.x(), aXCart, aYCart );
+ aTrsfPointC = QPointF( aXCart, aYCart );
+ }
+ }
+
// generate third points if needed
- if ( IsByTwoPoints() )
+ if ( anIsByTwoPoints )
{
aPointC = generateThirdPoint( aPointA, aPointB, true ).toPoint();
aTrsfPointC = generateThirdPoint( aTrsfPointA, aTrsfPointB, anIsRefImage );
if( !anIsInvertible )
return;
- QTransform aResTransform;
+ QTransform aResTransform = aTransform1Inverted * aTransform2;
if( anIsRefImage )
- aResTransform = aTransform1Inverted * aTransform2 * aRefTransform;
- else
- aResTransform = aTransform1Inverted * aTransform2;
+ aResTransform *= aRefTransform;
SetTrsf( aResTransform );
}
return aPointC.x() < 0 && aPointC.y() < 0;
}
+bool HYDROData_Image::HasReferences() const
+{
+ Handle(HYDROData_Image) aRefImage = GetTrsfReferenceImage();
+ int aNbReferences = NbReferences();
+
+ return !aRefImage.IsNull() || aNbReferences > 0;
+}
+
+void HYDROData_Image::RemoveAllReferences()
+{
+ if ( !HasReferences() )
+ return;
+
+ Handle(HYDROData_Image) aRefImage = GetTrsfReferenceImage();
+ if ( !aRefImage.IsNull() )
+ {
+ RemoveTrsfReferenceImage();
+ }
+ else
+ {
+ ClearReferences();
+ SetOperatorName( "" );
+ SetArgs( "" );
+ SetIsSelfSplitted( false );
+ }
+
+ SetToUpdate( false );
+
+ bool anIsByTwoPoints = IsByTwoPoints();
+
+ QImage anImage = Image();
+ if ( anImage.isNull() )
+ return;
+
+ // Set local points to default position
+ QPoint aLocalPointA = QPoint( 0, 0 );
+ QPoint aLocalPointB = QPoint( anImage.width(), 0 );
+ QPoint aLocalPointC = anIsByTwoPoints ? QPoint( INT_MIN, INT_MIN ) : QPoint( 0, anImage.height() );
+
+ SetLocalPoints( aLocalPointA, aLocalPointB, aLocalPointC, false );
+
+ // Calculate global points
+ QTransform aTransform = Trsf();
+
+ QPointF aTrsfPointA = QPointF( aTransform.map( aLocalPointA ) );
+ QPointF aTrsfPointB = QPointF( aTransform.map( aLocalPointB ) );
+ QPointF aTrsfPointC = anIsByTwoPoints ? QPointF( INT_MIN, INT_MIN ) :
+ QPointF( aTransform.map( aLocalPointC ) );
+
+ SetGlobalPoints( ManualCartesian, aTrsfPointA, aTrsfPointB, aTrsfPointC );
+}
+
void HYDROData_Image::SetLocalPoints( const QPoint& thePointA,
const QPoint& thePointB,
- const QPoint& thePointC )
+ const QPoint& thePointC,
+ const bool theIsUpdate )
{
Handle(TDataStd_RealArray) anArray;
if ( !myLab.FindChild( DataTag_TrsfPoints ).FindAttribute( TDataStd_RealArray::GetID(), anArray ) )
TDataStd_UAttribute::Set( myLab.FindChild( DataTag_TrsfPoints ), GUID_HAS_LOCAL_POINTS );
- UpdateTrsf();
+ if ( theIsUpdate )
+ UpdateTrsf();
}
bool HYDROData_Image::GetLocalPoints( QPoint& thePointA,
void HYDROData_Image::SetGlobalPoints( const TransformationMode& theMode,
const QPointF& thePointA,
const QPointF& thePointB,
- const QPointF& thePointC )
+ const QPointF& thePointC,
+ const bool theIsUpdate )
{
Handle(TDataStd_RealArray) anArray;
if ( !myLab.FindChild( DataTag_TrsfPoints ).FindAttribute( TDataStd_RealArray::GetID(), anArray ) )
TDataStd_UAttribute::Set( myLab.FindChild( DataTag_TrsfPoints ), GUID_HAS_GLOBAL_POINTS );
- UpdateTrsf();
+ if ( theIsUpdate )
+ UpdateTrsf();
/*
if( anIsRefImage )
void HYDROData_Image::SetReferencePoints( const Handle(HYDROData_Image)& theRefImage,
const QPointF& thePointA,
const QPointF& thePointB,
- const QPointF& thePointC )
+ const QPointF& thePointC,
+ const bool theIsUpdate )
{
SetTrsfReferenceImage( theRefImage );
- SetGlobalPoints( ReferenceImage, thePointA, thePointB, thePointC );
-
- UpdateTrsf();
+ SetGlobalPoints( ReferenceImage, thePointA, thePointB, thePointC, theIsUpdate );
}
bool HYDROData_Image::GetReferencePoints( Handle(HYDROData_Image)& theRefImage,
HYDROData_Image::TransformationMode HYDROData_Image::GetTrsfMode() const
{
- TransformationMode aResMode = ManualLambert;
+ TransformationMode aResMode = ManualGeodesic;
TDF_Label aLabel = myLab.FindChild( DataTag_TrsfPoints, false );
if ( !aLabel.IsNull() )
return Handle(HYDROData_Image)::DownCast( GetReferenceObject( DataTag_TrsfImage ) );
}
+void HYDROData_Image::RemoveTrsfReferenceImage()
+{
+ return RemoveReferenceObject( DataTag_TrsfImage );
+}
+
void HYDROData_Image::AppendReference( const Handle(HYDROData_Entity)& theReferenced )
{
AddReferenceObject( theReferenced, 0 );
return QByteArray(aData, aLen);
}
-void HYDROData_Image::MustBeUpdated(bool theFlag)
-{
- if (theFlag) {
- TDataStd_UAttribute::Set(myLab, GUID_MUST_BE_UPDATED);
- } else {
- myLab.ForgetAttribute(GUID_MUST_BE_UPDATED);
- }
-}
-
-bool HYDROData_Image::MustBeUpdated() const
-{
- return myLab.IsAttribute(GUID_MUST_BE_UPDATED);
-}
-
void HYDROData_Image::SetIsSelfSplitted(bool theFlag)
{
if (theFlag) {