#include<ImageComposer_CropOperator.h>
#include<ImageComposer_CutOperator.h>
#include<ImageComposer_FuseOperator.h>
-#include<ImageComposer_Image.h>
#include <typeinfo>
return FACTORY;
}
-ImageComposer_Operator* HYDROOperations_Factory::Operator(const QString theName) const
-{
- if (myOps.contains(theName)) {
- return myOps[theName];
- }
- return NULL;
-}
-
void HYDROOperations_Factory::Register(
ImageComposer_Operator* theOperator)
{
- FACTORY->myOps[QString(typeid(*theOperator).name())] = theOperator;
+ if ( !theOperator )
+ return;
+
+ FACTORY->myOps[ theOperator->name() ] = theOperator;
}
HYDROOperations_Factory::HYDROOperations_Factory()
}
ImageComposer_Operator* HYDROOperations_Factory::Operator(
- Handle(HYDROData_Image) theImage) const
+ Handle(HYDROData_Image) theImage ) const
{
// retreive operator instance by name
- ImageComposer_Operator* anOp = Operator(theImage->OperatorName());
- if (!anOp)
+ ImageComposer_Operator* anOp = Operator( theImage->OperatorName() );
+ if ( !anOp )
return anOp;
+
// fill arguments of the operator from theImage
- theImage->Args();
- anOp->setBinArgs(theImage->Args());
+ anOp->setBinArgs( theImage->Args() );
+
return anOp;
}
+ImageComposer_Operator* HYDROOperations_Factory::Operator(const QString theName) const
+{
+ return myOps.contains( theName ) ? myOps[ theName ] : NULL;
+}
+
Handle(HYDROData_Image) HYDROOperations_Factory::CreateImage(
Handle(HYDROData_Document) theDoc, const ImageComposer_Operator* theOperator)
{
Handle(HYDROData_Image)::DownCast(theDoc->CreateObject(KIND_IMAGE));
// get data from operation
if (theOperator) {
- anImage->SetOperatorName(QString(typeid(*theOperator).name()));
- anImage->SetArgs(theOperator->getBinArgs());
+ anImage->SetOperatorName( theOperator->name() );
+ anImage->SetArgs( theOperator->getBinArgs() );
}
return anImage;
}
-
-void HYDROOperations_Factory::UpdateImage(
- Handle_HYDROData_Document theDoc, Handle(HYDROData_Image) theImage)
-{
- // fill by arguments and process the operation
- ImageComposer_Operator* anOp = Operator(theImage);
- if (anOp) { // update image only if there is an operation
- QTransform aTransform;
- ImageComposer_Image anImage1; // first referenced image
- if (theImage->NbReferences()) {
- Handle(HYDROData_Image) anImage = theImage->Reference(0);
- anImage1 = anImage->Image();
- anImage1.setTransform(anImage->Trsf());
- aTransform = anImage1.transform();
- }
- ImageComposer_Image anImage2; // second referenced image
- if (theImage->NbReferences() > 1) {
- Handle(HYDROData_Image) anImage = theImage->Reference(1);
- anImage2 = anImage->Image();
- anImage2.setTransform(anImage->Trsf());
- }
- ImageComposer_Image aResImg = anOp->process(anImage1, anImage2);
- theImage->SetImage(aResImg);
- theImage->SetTrsf(aTransform);
- }
- // change the states of this and all depended images
- theImage->MustBeUpdated(true);
- SetMustBeUpdatedImages(theDoc);
- theImage->MustBeUpdated(false);
-}
-
-void HYDROOperations_Factory::SetMustBeUpdatedImages(
- Handle_HYDROData_Document theDoc) const
-{
- bool aChanged = true;
- // iterate until there is no changes because images on all level of dependency must be updated
- while(aChanged) {
- aChanged = false;
- HYDROData_Iterator anIter(theDoc, KIND_IMAGE);
- for(; anIter.More(); anIter.Next()) {
- Handle(HYDROData_Image) anImage =
- Handle(HYDROData_Image)::DownCast(anIter.Current());
- if (!anImage->MustBeUpdated()) {
- int a, aNBRefs = anImage->NbReferences();
- for(a = 0; a < aNBRefs; a++) {
- if (anImage->Reference(a)->MustBeUpdated()) {
- // image references to updated => also must be updated
- anImage->MustBeUpdated(true);
- aChanged = true;
- }
- }
- }
- }
- }
-}