Public Slots | Signals | Public Member Functions | Protected Slots | Protected Attributes

QmitkRigidRegistrationSelectorView Class Reference

Widget for rigid registration. More...

#include <QmitkRigidRegistrationSelectorView.h>

Collaboration diagram for QmitkRigidRegistrationSelectorView:
Collaboration graph
[legend]

List of all members.

Public Slots

void SetFixedNode (mitk::DataNode *fixedNode)
void SetFixedMaskNode (mitk::DataNode *fixedMaskNode)
void SetFixedDimension (int dimension)
void SetMovingNode (mitk::DataNode *movingNode)
void SetMovingNodeChildren (mitk::DataStorage::SetOfObjects::ConstPointer children)
void SetMovingMaskNode (mitk::DataNode *movingMaskNode)
void SetMovingDimension (int dimension)
int GetSelectedTransform ()
void CalculateTransformation (unsigned int timestep=0)
 this method starts the registration process
void StopOptimization (bool stopOptimization)

Signals

void TransformChanged ()
void OptimizerChanged (double value)
void AddNewTransformationToUndoList ()

Public Member Functions

 QmitkRigidRegistrationSelectorView (QWidget *parent=0, Qt::WindowFlags f=0)
 ~QmitkRigidRegistrationSelectorView ()

Protected Slots

void SetOptimizerValue (const itk::EventObject &)
void TransformSelected (int transform)
void MetricSelected (int metric)
void OptimizerSelected (int optimizer)
void LoadRigidRegistrationParameter ()
void SaveRigidRegistrationParameter ()
void LoadRigidRegistrationTestParameter ()
void SaveRigidRegistrationTestParameter ()
void DoLoadRigidRegistrationParameter (bool testPreset)
void DoLoadRigidRegistrationPreset (std::string presetName, bool testPreset)
void DoSaveRigidRegistrationParameter (bool testPreset)
void AddTransform (QmitkRigidRegistrationTransformsGUIBase *transform)
void AddMetric (QmitkRigidRegistrationMetricsGUIBase *metric)
void AddOptimizer (QmitkRigidRegistrationOptimizerGUIBase *optimizer)

Protected Attributes

Ui::QmitkRigidRegistrationSelector m_Controls
mitk::DataNode::Pointer m_FixedNode
mitk::DataNode::Pointer m_FixedMaskNode
mitk::DataNode::Pointer m_MovingNode
mitk::DataNode::Pointer m_MovingMaskNode
int m_FixedDimension
int m_MovingDimension
bool m_StopOptimization
mitk::RigidRegistrationPresetm_Preset
mitk::RigidRegistrationTestPresetm_TestPreset
mitk::Geometry3D::TransformType::Pointer m_GeometryItkPhysicalToWorldTransform
mitk::Geometry3D::TransformType::Pointer m_GeometryWorldToItkPhysicalTransform
mitk::Geometry3Dm_MovingGeometry
mitk::AffineGeometryFrame3D::Pointer m_ImageGeometry
mitk::RigidRegistrationObserver::Pointer m_Observer
mitk::DataStorage::SetOfObjects::ConstPointer m_MovingNodeChildren
std::map
< mitk::DataNode::Pointer,
mitk::Geometry3D * > 
m_ChildNodes
std::map
< mitk::DataNode::Pointer,
mitk::AffineGeometryFrame3D::Pointer
m_ChildNodes2

Detailed Description

Widget for rigid registration.

Displays options for rigid registration.

Definition at line 37 of file QmitkRigidRegistrationSelectorView.h.


Constructor & Destructor Documentation

QmitkRigidRegistrationSelectorView::QmitkRigidRegistrationSelectorView ( QWidget *  parent = 0,
Qt::WindowFlags  f = 0 
)

and show the selected views

Definition at line 81 of file QmitkRigidRegistrationSelectorView.cpp.

References AddMetric(), AddOptimizer(), AddTransform(), DoLoadRigidRegistrationPreset(), mitk::RigidRegistrationTestPreset::LoadPreset(), mitk::RigidRegistrationPreset::LoadPreset(), m_Controls, Ui_QmitkRigidRegistrationSelector::m_InterpolatorFrame, Ui_QmitkRigidRegistrationSelector::m_InterpolatorGroup, Ui_QmitkRigidRegistrationSelector::m_MetricBox, Ui_QmitkRigidRegistrationSelector::m_MetricFrame, Ui_QmitkRigidRegistrationSelector::m_MetricGroup, Ui_QmitkRigidRegistrationSelector::m_MetricWidgetStack, m_Observer, Ui_QmitkRigidRegistrationSelector::m_OptimizerBox, Ui_QmitkRigidRegistrationSelector::m_OptimizerFrame, Ui_QmitkRigidRegistrationSelector::m_OptimizerGroup, Ui_QmitkRigidRegistrationSelector::m_OptimizerWidgetStack, m_Preset, m_TestPreset, Ui_QmitkRigidRegistrationSelector::m_TransformBox, Ui_QmitkRigidRegistrationSelector::m_TransformFrame, Ui_QmitkRigidRegistrationSelector::m_TransformGroup, Ui_QmitkRigidRegistrationSelector::m_TransformWidgetStack, MetricSelected(), mitk::RigidRegistrationObserver::New(), OptimizerSelected(), Ui_QmitkRigidRegistrationSelector::setupUi(), and TransformSelected().

                                                                                                        : QWidget( parent, f ),
m_FixedNode(NULL), m_FixedMaskNode(NULL), m_MovingNode(NULL), m_MovingMaskNode(NULL), m_FixedDimension(0), m_MovingDimension(0), 
m_StopOptimization(false), m_GeometryItkPhysicalToWorldTransform(NULL), m_GeometryWorldToItkPhysicalTransform(NULL), 
m_MovingGeometry(NULL), m_ImageGeometry(NULL)
{
  m_Controls.setupUi(parent);

  this->AddTransform(new QmitkTranslationTransformView(this, f));
  this->AddTransform(new QmitkScaleTransformView(this, f));
  this->AddTransform(new QmitkScaleLogarithmicTransformView(this, f));
  this->AddTransform(new QmitkAffineTransformView(this, f));
  this->AddTransform(new QmitkFixedCenterOfRotationAffineTransformView(this, f));  
  this->AddTransform(new QmitkEuler3DTransformView(this, f));
  this->AddTransform(new QmitkCenteredEuler3DTransformView(this, f));
  this->AddTransform(new QmitkQuaternionRigidTransformView(this, f));
  this->AddTransform(new QmitkVersorTransformView(this, f));
  this->AddTransform(new QmitkVersorRigid3DTransformView(this, f));
  this->AddTransform(new QmitkScaleSkewVersor3DTransformView(this, f));
  this->AddTransform(new QmitkSimilarity3DTransformView(this, f));
  this->AddTransform(new QmitkRigid2DTransformView(this, f));
  this->AddTransform(new QmitkCenteredRigid2DTransformView(this, f));
  this->AddTransform(new QmitkEuler2DTransformView(this, f));
  this->AddTransform(new QmitkSimilarity2DTransformView(this, f));
  this->AddTransform(new QmitkCenteredSimilarity2DTransformView(this, f));

  this->AddMetric(new QmitkMeanSquaresMetricView(this, f));
  this->AddMetric(new QmitkNormalizedCorrelationMetricView(this, f));
  this->AddMetric(new QmitkGradientDifferenceMetricView(this, f));
  this->AddMetric(new QmitkKullbackLeiblerCompareHistogramMetricView(this, f));
  this->AddMetric(new QmitkCorrelationCoefficientHistogramMetricView(this, f));
  this->AddMetric(new QmitkMeanSquaresHistogramMetricView(this, f));
  this->AddMetric(new QmitkMutualInformationHistogramMetricView(this, f));
  this->AddMetric(new QmitkNormalizedMutualInformationHistogramMetricView(this, f));
  this->AddMetric(new QmitkMattesMutualInformationMetricView(this, f));
  this->AddMetric(new QmitkMeanReciprocalSquareDifferenceMetricView(this, f));
  this->AddMetric(new QmitkMutualInformationMetricView(this, f));
  this->AddMetric(new QmitkMatchCardinalityMetricView(this, f));
  this->AddMetric(new QmitkKappaStatisticMetricView(this, f));

  this->AddOptimizer(new QmitkExhaustiveOptimizerView(this, f));
  this->AddOptimizer(new QmitkGradientDescentOptimizerView(this, f));
  this->AddOptimizer(new QmitkQuaternionRigidTransformGradientDescentOptimizerView(this, f));
  this->AddOptimizer(new QmitkLBFGSBOptimizerView(this, f));
  this->AddOptimizer(new QmitkOnePlusOneEvolutionaryOptimizerView(this, f));
  this->AddOptimizer(new QmitkPowellOptimizerView(this, f));
  this->AddOptimizer(new QmitkFRPROptimizerView(this, f));
  this->AddOptimizer(new QmitkRegularStepGradientDescentOptimizerView(this, f));
  this->AddOptimizer(new QmitkVersorTransformOptimizerView(this, f));
  this->AddOptimizer(new QmitkAmoebaOptimizerView(this, f));
  this->AddOptimizer(new QmitkConjugateGradientOptimizerView(this, f));
  this->AddOptimizer(new QmitkLBFGSOptimizerView(this, f));
  this->AddOptimizer(new QmitkSPSAOptimizerView(this, f));
  this->AddOptimizer(new QmitkVersorRigid3DTransformOptimizerView(this, f));

  m_Observer = mitk::RigidRegistrationObserver::New();
  m_Controls.m_TransformFrame->setEnabled(true);
  m_Controls.m_MetricFrame->setEnabled(true);
  m_Controls.m_OptimizerFrame->setEnabled(true);
  m_Controls.m_InterpolatorFrame->setEnabled(true);

  m_Controls.m_TransformFrame->hide();
  m_Controls.m_MetricFrame->hide();
  m_Controls.m_OptimizerFrame->hide();
  m_Controls.m_InterpolatorFrame->hide();
  m_Controls.m_TransformBox->setCurrentIndex(0);
  m_Controls.m_MetricBox->setCurrentIndex(0);
  m_Controls.m_OptimizerBox->setCurrentIndex(0);
  m_Controls.m_TransformWidgetStack->setCurrentIndex(0);
  m_Controls.m_MetricWidgetStack->setCurrentIndex(0);
  m_Controls.m_OptimizerWidgetStack->setCurrentIndex(0);
  this->TransformSelected(m_Controls.m_TransformBox->currentIndex());
  this->MetricSelected(m_Controls.m_MetricBox->currentIndex());
  this->OptimizerSelected(m_Controls.m_OptimizerBox->currentIndex());
  

  connect( m_Controls.m_TransformGroup, SIGNAL(clicked(bool)), m_Controls.m_TransformFrame, SLOT(setVisible(bool)));
  connect( m_Controls.m_TransformBox, SIGNAL(activated(int)), m_Controls.m_TransformWidgetStack, SLOT(setCurrentIndex(int)));
  connect( m_Controls.m_TransformBox, SIGNAL(activated(int)), this, SLOT(TransformSelected(int)));
  connect( m_Controls.m_MetricBox, SIGNAL(activated(int)), this, SLOT(MetricSelected(int)));
  connect( m_Controls.m_OptimizerBox, SIGNAL(activated(int)), this, SLOT(OptimizerSelected(int)));
  connect( m_Controls.m_MetricGroup, SIGNAL(clicked(bool)), m_Controls.m_MetricFrame, SLOT(setVisible(bool)));
  connect( m_Controls.m_MetricBox, SIGNAL(activated(int)), m_Controls.m_MetricWidgetStack, SLOT(setCurrentIndex(int)));
  connect( m_Controls.m_OptimizerGroup, SIGNAL(clicked(bool)), m_Controls.m_OptimizerFrame, SLOT(setVisible(bool)));
  connect( m_Controls.m_OptimizerBox, SIGNAL(activated(int)), m_Controls.m_OptimizerWidgetStack, SLOT(setCurrentIndex(int)));
  connect( m_Controls.m_InterpolatorGroup, SIGNAL(toggled(bool)), m_Controls.m_InterpolatorFrame, SLOT(setVisible(bool)));

  m_Preset = new mitk::RigidRegistrationPreset();
  m_Preset->LoadPreset();

  m_TestPreset = new mitk::RigidRegistrationTestPreset();
  m_TestPreset->LoadPreset();

  this->DoLoadRigidRegistrationPreset("AffineMutualInformationGradientDescent", false);
}
QmitkRigidRegistrationSelectorView::~QmitkRigidRegistrationSelectorView (  )

Definition at line 178 of file QmitkRigidRegistrationSelectorView.cpp.

{
}

Member Function Documentation

void QmitkRigidRegistrationSelectorView::AddMetric ( QmitkRigidRegistrationMetricsGUIBase metric ) [protected, slot]
void QmitkRigidRegistrationSelectorView::AddNewTransformationToUndoList (  ) [signal]

Referenced by CalculateTransformation().

void QmitkRigidRegistrationSelectorView::AddOptimizer ( QmitkRigidRegistrationOptimizerGUIBase optimizer ) [protected, slot]
void QmitkRigidRegistrationSelectorView::AddTransform ( QmitkRigidRegistrationTransformsGUIBase transform ) [protected, slot]
void QmitkRigidRegistrationSelectorView::CalculateTransformation ( unsigned int  timestep = 0 ) [slot]

this method starts the registration process

Definition at line 183 of file QmitkRigidRegistrationSelectorView.cpp.

References AddNewTransformationToUndoList(), mitk::RenderingManager::GetInstance(), mitk::ProgressBar::GetInstance(), mitk::GetWorldToItkPhysicalTransform(), m_ChildNodes, m_ChildNodes2, m_Controls, m_FixedMaskNode, m_FixedNode, m_GeometryItkPhysicalToWorldTransform, m_GeometryWorldToItkPhysicalTransform, m_ImageGeometry, Ui_QmitkRigidRegistrationSelector::m_InterpolatorBox, Ui_QmitkRigidRegistrationSelector::m_MetricWidgetStack, m_MovingGeometry, m_MovingMaskNode, m_MovingNode, m_MovingNodeChildren, m_Observer, Ui_QmitkRigidRegistrationSelector::m_OptimizerWidgetStack, Ui_QmitkRigidRegistrationSelector::m_TransformWidgetStack, MITK_INFO, mitk::ImageRegistrationMethod::New(), mitk::ImageTimeSelector::New(), and SetOptimizerValue().

Referenced by QmitkRigidRegistrationView::Calculate().

{
  if (m_FixedNode.IsNotNull() && m_MovingNode.IsNotNull())
  {
    emit AddNewTransformationToUndoList();

    mitk::Image::Pointer fimage = dynamic_cast<mitk::Image*>(m_FixedNode->GetData());
    mitk::Image::Pointer mimage = dynamic_cast<mitk::Image*>(m_MovingNode->GetData());
    mitk::Image::Pointer mmimage = NULL;
    mitk::Image::Pointer fmimage = NULL;
    if (m_MovingMaskNode.IsNotNull())
    {
      mmimage = dynamic_cast<mitk::Image*>(m_MovingMaskNode->GetData());
    }
    if (m_FixedMaskNode.IsNotNull())
    {
      fmimage = dynamic_cast<mitk::Image*>(m_FixedMaskNode->GetData());
    }

    mitk::ImageTimeSelector::Pointer its = mitk::ImageTimeSelector::New();

    if(fimage->GetDimension()>3)
    {
      its->SetInput(fimage);
      its->SetTimeNr(timestep);
      its->Update();
      fimage = its->GetOutput();
    }

    if(mimage->GetDimension()>3)
    {
      its->SetInput(mimage);
      its->SetTimeNr(timestep);
      its->Update();
      mimage = its->GetOutput();
    }

    // Initial moving image geometry
    m_ImageGeometry = m_MovingNode->GetData()->GetGeometry()->Clone();
    std::cout << "Moving Image Geometry (IndexToWorldTransform)"  << std::endl;
    std::cout << m_ImageGeometry->GetIndexToWorldTransform()->GetMatrix();
    mitk::Geometry3D::TransformType::InputPointType center = m_ImageGeometry->GetIndexToWorldTransform()->GetCenter();
    std::cout << "center " << center[0] << " " << center[1] << " " << center[2]  << std::endl;
    mitk::Geometry3D::TransformType::OutputVectorType offset = m_ImageGeometry->GetIndexToWorldTransform()->GetOffset();
    std::cout << "offset " << offset[0] << " " << offset[1] << " " << offset[2]  << std::endl;
    std::cout << std::endl;

    // Fixed image geometry
    //     mitk::AffineGeometryFrame3D::Pointer m_FixedGeometryCopy = m_FixedNode->GetData()->GetGeometry()->Clone();
    //     std::cout << "Fixed Image Geometry (IndexToWorldTransform)"  << std::endl;
    //     std::cout << m_FixedGeometryCopy->GetIndexToWorldTransform()->GetMatrix();
    //     center = m_FixedGeometryCopy->GetIndexToWorldTransform()->GetCenter();
    //     std::cout << "center " << center[0] << " " << center[1] << " " << center[2]  << std::endl;
    //     offset = m_FixedGeometryCopy->GetIndexToWorldTransform()->GetOffset();
    //     std::cout << "offset " << offset[0] << " " << offset[1] << " " << offset[2]  << std::endl;
    //     std::cout << std::endl;

    // Calculate the World to ITK-Physical transform for the moving image
    m_MovingGeometry = m_MovingNode->GetData()->GetGeometry();

    unsigned long size;
    size = m_MovingNodeChildren->Size();
    mitk::DataNode::Pointer childNode;
    for (unsigned long i = 0; i < size; ++i)
    {
      m_ChildNodes.insert(std::pair<mitk::DataNode::Pointer, mitk::Geometry3D*>(m_MovingNodeChildren->GetElement(i), m_MovingNodeChildren->GetElement(i)->GetData()->GetGeometry()));
      m_ChildNodes2.insert(std::pair<mitk::DataNode::Pointer, mitk::AffineGeometryFrame3D::Pointer>(m_MovingNodeChildren->GetElement(i), m_MovingNodeChildren->GetElement(i)->GetData()->GetGeometry()->Clone()));
    }

    m_GeometryWorldToItkPhysicalTransform = mitk::Geometry3D::TransformType::New();
    GetWorldToItkPhysicalTransform(m_MovingGeometry, m_GeometryWorldToItkPhysicalTransform.GetPointer());

    //     std::cout << "Moving Image: World to ITK-physical transform" << std::endl;
    //     std::cout << m_GeometryWorldToItkPhysicalTransform->GetMatrix();
    //     center = m_GeometryWorldToItkPhysicalTransform->GetCenter();
    //     std::cout << "center " << center[0] << " " << center[1] << " " << center[2]  << std::endl;
    //     offset = m_GeometryWorldToItkPhysicalTransform->GetOffset();
    //     std::cout << "offset " << offset[0] << " " << offset[1] << " " << offset[2]  << std::endl;
    //     std::cout << std::endl;

    // Calculate the ITK-Physical to World transform for the fixed image
    m_GeometryItkPhysicalToWorldTransform = mitk::Geometry3D::TransformType::New();
    mitk::Geometry3D::TransformType::Pointer fixedWorld2Phys = mitk::Geometry3D::TransformType::New();
    GetWorldToItkPhysicalTransform(m_FixedNode->GetData()->GetGeometry(), fixedWorld2Phys.GetPointer());
    fixedWorld2Phys->GetInverse(m_GeometryItkPhysicalToWorldTransform);

    //     std::cout << "Fixed Image: ITK-physical to World transform" << std::endl;
    //     std::cout << m_GeometryItkPhysicalToWorldTransform->GetMatrix();
    //     center = m_GeometryItkPhysicalToWorldTransform->GetCenter();
    //     std::cout << "center " << center[0] << " " << center[1] << " " << center[2]  << std::endl;
    //     offset = m_GeometryItkPhysicalToWorldTransform->GetOffset();
    //     std::cout << "offset " << offset[0] << " " << offset[1] << " " << offset[2]  << std::endl;
    //     std::cout << std::endl;

    // init callback
    itk::ReceptorMemberCommand<QmitkRigidRegistrationSelectorView>::Pointer command = itk::ReceptorMemberCommand<QmitkRigidRegistrationSelectorView>::New();
    command->SetCallbackFunction(this, &QmitkRigidRegistrationSelectorView::SetOptimizerValue);
    int observer = m_Observer->AddObserver( itk::AnyEvent(), command );

    std::vector<std::string> presets;
    // init registration method
    mitk::ImageRegistrationMethod::Pointer registration = mitk::ImageRegistrationMethod::New(); 

    registration->SetObserver(m_Observer);
    registration->SetInterpolator(m_Controls.m_InterpolatorBox->currentIndex());
    registration->SetReferenceImage(fimage);
    registration->SetInput(mimage);    
    if (mmimage.IsNotNull())
    {
      registration->SetMovingMask(mmimage);
    }
    if (fmimage.IsNotNull())
    {
      registration->SetFixedMask(fmimage);
    }
    
    dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->SetFixedImage(dynamic_cast<mitk::Image*>(m_FixedNode->GetData()));
    dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->SetMovingImage(dynamic_cast<mitk::Image*>(m_MovingNode->GetData()));
    registration->SetOptimizerScales(dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->GetScales());
    registration->SetTransform(dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->GetTransform());
    
    dynamic_cast<QmitkRigidRegistrationMetricsGUIBase*>(m_Controls.m_MetricWidgetStack->currentWidget())->SetMovingImage(dynamic_cast<mitk::Image*>(m_MovingNode->GetData()));
    registration->SetMetric(dynamic_cast<QmitkRigidRegistrationMetricsGUIBase*>(m_Controls.m_MetricWidgetStack->currentWidget())->GetMetric());
    
    registration->SetOptimizer(dynamic_cast<QmitkRigidRegistrationOptimizerGUIBase*>(m_Controls.m_OptimizerWidgetStack->currentWidget())->GetOptimizer());

    double time(0.0);
    double tstart(0.0);
    tstart = clock();

    try
    {
      registration->Update();
    }
    catch (itk::ExceptionObject e)
    {
      MITK_INFO << "Caught exception: "<<e.GetDescription();
      QMessageBox::information( this, "Registration exception", e.GetDescription());
      mitk::ProgressBar::GetInstance()->Progress(20);
    }

    time += clock() - tstart;
    time = time / CLOCKS_PER_SEC;

    //printOut of the Time
    MITK_INFO << "Registration Time: " << time;

    m_Observer->RemoveObserver(observer);
    mitk::RenderingManager::GetInstance()->RequestUpdateAll();
  }  
}
void QmitkRigidRegistrationSelectorView::DoLoadRigidRegistrationParameter ( bool  testPreset ) [protected, slot]

Definition at line 525 of file QmitkRigidRegistrationSelectorView.cpp.

References DoLoadRigidRegistrationPreset(), QmitkLoadPresetDialog::GetPresetName(), mitk::RigidRegistrationPreset::getTransformValuesPresets(), mitk::RigidRegistrationTestPreset::getTransformValuesPresets(), m_Preset, and m_TestPreset.

Referenced by LoadRigidRegistrationParameter(), and LoadRigidRegistrationTestParameter().

{
  std::map<std::string, itk::Array<double> > existingPresets;
  if (testPreset)
  {
    existingPresets = m_TestPreset->getTransformValuesPresets(); 
  }
  else
  {
    existingPresets = m_Preset->getTransformValuesPresets();
  }

  std::map<std::string, itk::Array<double> >::iterator iter;
  std::list<std::string> presets;
  for( iter = existingPresets.begin(); iter != existingPresets.end(); iter++ ) 
  {
    presets.push_back( (*iter).first );
  }
  if (presets.empty())
  {
    QMessageBox::warning( NULL, "RigidRegistrationParameters.xml", "RigidRegistrationParameters.xml is empty/does not exist. There are no presets to select.");
    return;
  }
  presets.sort();
  // ask about the name to load a preset
  QmitkLoadPresetDialog dialog( this, 0, "Load Preset", presets ); // needs a QWidget as parent
  int dialogReturnValue = dialog.exec();
  if ( dialogReturnValue == QDialog::Rejected ) return; // user clicked cancel or pressed Esc or something similar

  this->DoLoadRigidRegistrationPreset(dialog.GetPresetName(), testPreset);
}
void QmitkRigidRegistrationSelectorView::DoLoadRigidRegistrationPreset ( std::string  presetName,
bool  testPreset 
) [protected, slot]

Definition at line 557 of file QmitkRigidRegistrationSelectorView.cpp.

References mitk::RigidRegistrationPreset::getInterpolatorValues(), mitk::RigidRegistrationTestPreset::getInterpolatorValues(), mitk::RigidRegistrationPreset::getMetricValues(), mitk::RigidRegistrationTestPreset::getMetricValues(), mitk::RigidRegistrationPreset::getOptimizerValues(), mitk::RigidRegistrationTestPreset::getOptimizerValues(), mitk::RigidRegistrationPreset::getTransformValues(), mitk::RigidRegistrationTestPreset::getTransformValues(), m_Controls, Ui_QmitkRigidRegistrationSelector::m_InterpolatorBox, Ui_QmitkRigidRegistrationSelector::m_InterpolatorFrame, Ui_QmitkRigidRegistrationSelector::m_InterpolatorGroup, Ui_QmitkRigidRegistrationSelector::m_MetricBox, Ui_QmitkRigidRegistrationSelector::m_MetricFrame, Ui_QmitkRigidRegistrationSelector::m_MetricGroup, Ui_QmitkRigidRegistrationSelector::m_MetricWidgetStack, Ui_QmitkRigidRegistrationSelector::m_OptimizerBox, Ui_QmitkRigidRegistrationSelector::m_OptimizerFrame, Ui_QmitkRigidRegistrationSelector::m_OptimizerGroup, Ui_QmitkRigidRegistrationSelector::m_OptimizerWidgetStack, m_Preset, m_TestPreset, Ui_QmitkRigidRegistrationSelector::m_TransformBox, Ui_QmitkRigidRegistrationSelector::m_TransformFrame, Ui_QmitkRigidRegistrationSelector::m_TransformGroup, Ui_QmitkRigidRegistrationSelector::m_TransformWidgetStack, MetricSelected(), OptimizerSelected(), and TransformSelected().

Referenced by DoLoadRigidRegistrationParameter(), and QmitkRigidRegistrationSelectorView().

{
  itk::Array<double> transformValues;
  if (testPreset)
  {
    transformValues = m_TestPreset->getTransformValues(presetName);
  }
  else
  {
    transformValues = m_Preset->getTransformValues(presetName);
  }
  m_Controls.m_TransformGroup->setChecked(true);
  m_Controls.m_TransformFrame->setVisible(true);
  m_Controls.m_TransformBox->setCurrentIndex((int)transformValues[0]);
  m_Controls.m_TransformWidgetStack->setCurrentIndex((int)transformValues[0]);
  this->TransformSelected((int)transformValues[0]);
  itk::Array<double> transformValuesForGUI;
  transformValuesForGUI.SetSize(transformValues.Size());
  transformValuesForGUI.fill(0);
  for (unsigned int i = 1; i < transformValues.Size(); i++)
  {
    transformValuesForGUI[i-1] = transformValues[i];
  }
  dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->SetTransformParameters(transformValuesForGUI);

  itk::Array<double> metricValues;
  if (testPreset)
  {
    metricValues = m_TestPreset->getMetricValues(presetName);
  }
  else
  {
    metricValues = m_Preset->getMetricValues(presetName);
  }
  m_Controls.m_MetricGroup->setChecked(true);
  m_Controls.m_MetricFrame->setVisible(true);
  m_Controls.m_MetricBox->setCurrentIndex((int)metricValues[0]);
  m_Controls.m_MetricWidgetStack->setCurrentIndex((int)metricValues[0]);
  this->MetricSelected((int)metricValues[0]);
  itk::Array<double> metricValuesForGUI;
  metricValuesForGUI.SetSize(metricValues.Size());
  metricValuesForGUI.fill(0);
  for (unsigned int i = 1; i < metricValues.Size(); i++)
  {
    metricValuesForGUI[i-1] = metricValues[i];
  }
  dynamic_cast<QmitkRigidRegistrationMetricsGUIBase*>(m_Controls.m_MetricWidgetStack->currentWidget())->SetMetricParameters(metricValuesForGUI);

  itk::Array<double> optimizerValues;
  if (testPreset)
  {
    optimizerValues = m_TestPreset->getOptimizerValues(presetName);
  }
  else
  {
    optimizerValues = m_Preset->getOptimizerValues(presetName);
  } 
  m_Controls.m_OptimizerGroup->setChecked(true);
  m_Controls.m_OptimizerFrame->setVisible(true);
  m_Controls.m_OptimizerBox->setCurrentIndex((int)optimizerValues[0]);
  m_Controls.m_OptimizerWidgetStack->setCurrentIndex((int)optimizerValues[0]);
  this->OptimizerSelected((int)optimizerValues[0]);
  itk::Array<double> optimizerValuesForGUI;
  optimizerValuesForGUI.SetSize(optimizerValues.Size());
  optimizerValuesForGUI.fill(0);
  for (unsigned int i = 1; i < optimizerValues.Size(); i++)
  {
    optimizerValuesForGUI[i-1] = optimizerValues[i];
  }
  dynamic_cast<QmitkRigidRegistrationOptimizerGUIBase*>(m_Controls.m_OptimizerWidgetStack->currentWidget())->SetOptimizerParameters(optimizerValuesForGUI);

  itk::Array<double> interpolatorValues;
  if (testPreset)
  {
    interpolatorValues = m_TestPreset->getInterpolatorValues(presetName);
  }
  else
  {
    interpolatorValues = m_Preset->getInterpolatorValues(presetName);
  }
  m_Controls.m_InterpolatorGroup->setChecked(true);
  m_Controls.m_InterpolatorFrame->setVisible(true);
  m_Controls.m_InterpolatorBox->setCurrentIndex((int)interpolatorValues[0]);
}
void QmitkRigidRegistrationSelectorView::DoSaveRigidRegistrationParameter ( bool  testPreset ) [protected, slot]

Definition at line 652 of file QmitkRigidRegistrationSelectorView.cpp.

References mitk::RigidRegistrationPreset::getInterpolatorValuesPresets(), mitk::RigidRegistrationTestPreset::getInterpolatorValuesPresets(), mitk::RigidRegistrationPreset::getMetricValuesPresets(), mitk::RigidRegistrationTestPreset::getMetricValuesPresets(), mitk::RigidRegistrationPreset::getOptimizerValuesPresets(), mitk::RigidRegistrationTestPreset::getOptimizerValuesPresets(), mitk::RigidRegistrationPreset::getTransformValuesPresets(), mitk::RigidRegistrationTestPreset::getTransformValuesPresets(), m_Controls, Ui_QmitkRigidRegistrationSelector::m_InterpolatorBox, Ui_QmitkRigidRegistrationSelector::m_MetricBox, Ui_QmitkRigidRegistrationSelector::m_MetricWidgetStack, Ui_QmitkRigidRegistrationSelector::m_OptimizerBox, Ui_QmitkRigidRegistrationSelector::m_OptimizerWidgetStack, m_Preset, m_TestPreset, Ui_QmitkRigidRegistrationSelector::m_TransformBox, Ui_QmitkRigidRegistrationSelector::m_TransformWidgetStack, mitk::RigidRegistrationPreset::newPresets(), and mitk::RigidRegistrationTestPreset::newPresets().

Referenced by SaveRigidRegistrationParameter(), and SaveRigidRegistrationTestParameter().

{
  bool ok;
  QString text = QInputDialog::getText(this, 
    "Save Parameter Preset", "Enter name for preset:", QLineEdit::Normal,
    QString::null, &ok );
  if ( ok )
  {
    std::map<std::string, itk::Array<double> > existingPresets;
    if (testPreset)
    {
      existingPresets = m_TestPreset->getTransformValuesPresets();
    }
    else
    {
      existingPresets = m_Preset->getTransformValuesPresets();
    }
    std::map<std::string, itk::Array<double> >::iterator iter = existingPresets.find(std::string((const char*)text.toLatin1()));
    if (iter != existingPresets.end())
    {
      QMessageBox::critical( this, "Preset definition",
        "Presetname already exists.");
      return;
    }
    if (text.isEmpty())
    {
      QMessageBox::critical( this, "Preset definition",
        "Presetname has to be set.\n"
        "You have to enter a Presetname." );
      return;
    }
    itk::Array<double> transformValues;
    transformValues.SetSize(25);
    transformValues.fill(0);
    transformValues[0] = m_Controls.m_TransformBox->currentIndex();

    itk::Array<double> transformValuesFromGUI = dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->GetTransformParameters();
    for (unsigned int i = 0; i < transformValuesFromGUI.Size(); i++)
    {
      transformValues[i+1] = transformValuesFromGUI[i];
    }

    std::map<std::string, itk::Array<double> > transformMap;
    if (testPreset)
    {
      transformMap = m_TestPreset->getTransformValuesPresets();
    }
    else
    {
      transformMap = m_Preset->getTransformValuesPresets();
    }
    transformMap[std::string((const char*)text.toLatin1())] = transformValues;

    itk::Array<double> metricValues;
    metricValues.SetSize(25);
    metricValues.fill(0);
    metricValues[0] = m_Controls.m_MetricBox->currentIndex();
    itk::Array<double> metricValuesFromGUI = dynamic_cast<QmitkRigidRegistrationMetricsGUIBase*>(m_Controls.m_MetricWidgetStack->currentWidget())->GetMetricParameters();
    for (unsigned int i = 0; i < metricValuesFromGUI.Size(); i++)
    {
      metricValues[i+1] = metricValuesFromGUI[i];
    }

    std::map<std::string, itk::Array<double> > metricMap;
    if (testPreset)
    {
      metricMap = m_TestPreset->getMetricValuesPresets();
    }
    else
    {
      metricMap = m_Preset->getMetricValuesPresets();
    }
    metricMap[std::string((const char*)text.toLatin1())] = metricValues;

    itk::Array<double> optimizerValues;
    optimizerValues.SetSize(25);
    optimizerValues.fill(0);
    optimizerValues[0] = m_Controls.m_OptimizerBox->currentIndex();
    itk::Array<double> optimizerValuesFromGUI = dynamic_cast<QmitkRigidRegistrationOptimizerGUIBase*>(m_Controls.m_OptimizerWidgetStack->currentWidget())->GetOptimizerParameters();
    for (unsigned int i = 0; i < optimizerValuesFromGUI.Size(); i++)
    {
      optimizerValues[i+1] = optimizerValuesFromGUI[i];
    }

    std::map<std::string, itk::Array<double> > optimizerMap;
    if (testPreset)
    {
      optimizerMap = m_TestPreset->getOptimizerValuesPresets();
    }
    else
    {
      optimizerMap = m_Preset->getOptimizerValuesPresets();
    }
    optimizerMap[std::string((const char*)text.toLatin1())] = optimizerValues;

    itk::Array<double> interpolatorValues;
    interpolatorValues.SetSize(25);
    interpolatorValues.fill(0);
    interpolatorValues[0] = m_Controls.m_InterpolatorBox->currentIndex();

    std::map<std::string, itk::Array<double> > interpolatorMap;
    if (testPreset)
    {
      interpolatorMap = m_TestPreset->getInterpolatorValuesPresets();
    }
    else
    {
      interpolatorMap = m_Preset->getInterpolatorValuesPresets();
    }
    interpolatorMap[std::string((const char*)text.toLatin1())] = interpolatorValues;

    if (testPreset)
    {
      m_TestPreset->newPresets(transformMap, metricMap, optimizerMap, interpolatorMap);
    }
    else
    {
      m_Preset->newPresets(transformMap, metricMap, optimizerMap, interpolatorMap);
    }
  }
  else 
  {
    // user pressed Cancel
  }
}
int QmitkRigidRegistrationSelectorView::GetSelectedTransform (  ) [slot]
void QmitkRigidRegistrationSelectorView::LoadRigidRegistrationParameter (  ) [protected, slot]
void QmitkRigidRegistrationSelectorView::LoadRigidRegistrationTestParameter (  ) [protected, slot]
void QmitkRigidRegistrationSelectorView::MetricSelected ( int  metric ) [protected, slot]

this method is called whenever the combobox with the selectable metrics changes responsible for showing the selected metricparameters

this method is called whenever the combobox with the selectable metrics changes responsible for showing the selected metric parameters

Definition at line 493 of file QmitkRigidRegistrationSelectorView.cpp.

References m_Controls, m_FixedNode, Ui_QmitkRigidRegistrationSelector::m_MetricWidgetStack, and m_MovingNode.

Referenced by DoLoadRigidRegistrationPreset(), and QmitkRigidRegistrationSelectorView().

{
  if (m_FixedNode.IsNotNull())
  {
    dynamic_cast<QmitkRigidRegistrationMetricsGUIBase*>(m_Controls.m_MetricWidgetStack->widget(metric))->SetMovingImage(dynamic_cast<mitk::Image*>(m_MovingNode->GetData()));
  }

  //set fixed height
  m_Controls.m_MetricWidgetStack->setFixedHeight( dynamic_cast<QmitkRigidRegistrationMetricsGUIBase*>(m_Controls.m_MetricWidgetStack->widget(metric))->minimumSizeHint().height() );
}
void QmitkRigidRegistrationSelectorView::OptimizerChanged ( double  value ) [signal]

Referenced by SetOptimizerValue().

void QmitkRigidRegistrationSelectorView::OptimizerSelected ( int  optimizer ) [protected, slot]

this method is called whenever the combobox with the selectable optimizer changes responsible for showing the selected optimizerparameters

this method is called whenever the combobox with the selectable optimizers changes responsible for showing the selected optimizer parameters

Definition at line 506 of file QmitkRigidRegistrationSelectorView.cpp.

References m_Controls, Ui_QmitkRigidRegistrationSelector::m_OptimizerWidgetStack, and Ui_QmitkRigidRegistrationSelector::m_TransformWidgetStack.

Referenced by DoLoadRigidRegistrationPreset(), QmitkRigidRegistrationSelectorView(), and TransformSelected().

{
  int numberOfTransformParameters = dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->GetNumberOfTransformParameters();
  dynamic_cast<QmitkRigidRegistrationOptimizerGUIBase*>(m_Controls.m_OptimizerWidgetStack->widget(optimizer))->SetNumberOfTransformParameters(numberOfTransformParameters);

  //set fixed height
  m_Controls.m_OptimizerWidgetStack->setFixedHeight( dynamic_cast<QmitkRigidRegistrationOptimizerGUIBase*>(m_Controls.m_OptimizerWidgetStack->widget(optimizer))->minimumSizeHint().height() );
}
void QmitkRigidRegistrationSelectorView::SaveRigidRegistrationParameter (  ) [protected, slot]
void QmitkRigidRegistrationSelectorView::SaveRigidRegistrationTestParameter (  ) [protected, slot]
void QmitkRigidRegistrationSelectorView::SetFixedDimension ( int  dimension ) [slot]

Definition at line 341 of file QmitkRigidRegistrationSelectorView.cpp.

References m_FixedDimension.

Referenced by QmitkRigidRegistrationView::FixedSelected().

{
  m_FixedDimension = dimension;
}
void QmitkRigidRegistrationSelectorView::SetFixedMaskNode ( mitk::DataNode fixedMaskNode ) [slot]
void QmitkRigidRegistrationSelectorView::SetFixedNode ( mitk::DataNode fixedNode ) [slot]
void QmitkRigidRegistrationSelectorView::SetMovingDimension ( int  dimension ) [slot]
void QmitkRigidRegistrationSelectorView::SetMovingMaskNode ( mitk::DataNode movingMaskNode ) [slot]
void QmitkRigidRegistrationSelectorView::SetMovingNode ( mitk::DataNode movingNode ) [slot]
void QmitkRigidRegistrationSelectorView::SetMovingNodeChildren ( mitk::DataStorage::SetOfObjects::ConstPointer  children ) [slot]
void QmitkRigidRegistrationSelectorView::SetOptimizerValue ( const itk::EventObject &   ) [protected, slot]

Definition at line 362 of file QmitkRigidRegistrationSelectorView.cpp.

References mitk::Geometry3D::Compose(), mitk::Geometry3D::GetIndexToWorldTransform(), mitk::RenderingManager::GetInstance(), m_ChildNodes, m_ChildNodes2, m_Controls, m_GeometryItkPhysicalToWorldTransform, m_GeometryWorldToItkPhysicalTransform, m_ImageGeometry, m_MovingGeometry, m_MovingNode, m_Observer, m_StopOptimization, Ui_QmitkRigidRegistrationSelector::m_TransformWidgetStack, OptimizerChanged(), and mitk::Geometry3D::SetIndexToWorldTransformByVtkMatrix().

Referenced by CalculateTransformation().

{
  if (m_StopOptimization)
  {
    m_Observer->SetStopOptimization(true);
    m_StopOptimization = false;
  }

  // retreive optimizer value for the current transformation
  double value = m_Observer->GetCurrentOptimizerValue();

  // retreive current parameterset of the transformation
  itk::Array<double> transformParams = m_Observer->GetCurrentTranslation();

  // init an empty affine transformation that will be filled with
  // the corresponding transformation parameters in the following
  vtkMatrix4x4* vtkmatrix = vtkMatrix4x4::New();
  vtkmatrix->Identity();

  // init a transform that will be initialized with the vtkmatrix later
  vtkTransform* vtktransform = vtkTransform::New();

  if (m_MovingNode.IsNotNull())
  {
    vtktransform = dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->Transform(vtkmatrix, vtktransform, transformParams);

    // the retrieved transform goes from fixed to moving space.
    // invert the transform in order to go from moving to fixed space.
    vtkMatrix4x4* vtkmatrix_inv = vtkMatrix4x4::New();
    vtktransform->GetInverse(vtkmatrix_inv);

    // now adapt the moving geometry accordingly
    m_MovingGeometry->GetIndexToWorldTransform()->SetIdentity();

    // the next view lines: Phi(Phys2World)*Phi(Result)*Phi(World2Phy)*Phi(Initial)

    // set moving image geometry to registration result
    m_MovingGeometry->SetIndexToWorldTransformByVtkMatrix(vtkmatrix_inv);

    /*std::cout << std::endl;
    std::cout << m_MovingGeometry->GetIndexToWorldTransform()->GetMatrix();
    mitk::Geometry3D::TransformType::OutputVectorType offset = m_MovingGeometry->GetIndexToWorldTransform()->GetOffset();
    std::cout << "offset " << offset[0] << " " << offset[1] << " " << offset[2]  << std::endl;*/


#if !defined(ITK_IMAGE_BEHAVES_AS_ORIENTED_IMAGE)
    // the next few lines: Phi(Phys2World)*Phi(Result)*Phi(World2Phy)*Phi(Initial)
    // go to itk physical space before applying the registration result
    m_MovingGeometry->Compose(m_GeometryWorldToItkPhysicalTransform, 1);

    // right in the beginning, transform by initial moving image geometry
    m_MovingGeometry->Compose(m_ImageGeometry->GetIndexToWorldTransform(), 1);

    // in the end, go back to world space
    m_MovingGeometry->Compose(m_GeometryItkPhysicalToWorldTransform, 0);  

#else     
    m_MovingGeometry->Compose(m_ImageGeometry->GetIndexToWorldTransform(), 1);
#endif

    /*std::cout << std::endl << m_MovingGeometry->GetIndexToWorldTransform()->GetMatrix();
    offset = m_MovingGeometry->GetIndexToWorldTransform()->GetOffset();
    std::cout << "offset " << offset[0] << " " << offset[1] << " " << offset[2]  << std::endl << std::endl;*/

    // now adapt all children geometries accordingly if children exist
    std::map<mitk::DataNode::Pointer, mitk::Geometry3D*>::iterator iter;
    std::map<mitk::DataNode::Pointer, mitk::AffineGeometryFrame3D::Pointer>::iterator iter2;
    mitk::DataNode::Pointer childNode;
    for( iter = m_ChildNodes.begin(); iter != m_ChildNodes.end(); iter++ ) 
    {
      childNode = (*iter).first;
      if (childNode.IsNotNull())
      {
        mitk::Geometry3D* childGeometry;
        mitk::AffineGeometryFrame3D::Pointer childImageGeometry;
        // Calculate the World to ITK-Physical transform for the moving mask
        childGeometry = (*iter).second;
        iter2 = m_ChildNodes2.find(childNode);
        childImageGeometry = (*iter2).second;

        childGeometry->GetIndexToWorldTransform()->SetIdentity();

        // the next view lines: Phi(Phys2World)*Phi(Result)*Phi(World2Phy)*Phi(Initial)

        // set moving mask geometry to registration result
        childGeometry->SetIndexToWorldTransformByVtkMatrix(vtkmatrix_inv);

#if !defined(ITK_IMAGE_BEHAVES_AS_ORIENTED_IMAGE)
        // the next few lines: Phi(Phys2World)*Phi(Result)*Phi(World2Phy)*Phi(Initial)
        // go to itk physical space before applying the registration result
        childGeometry->Compose(m_GeometryWorldToItkPhysicalTransform, 1);

        // right in the beginning, transform by initial moving image geometry
        childGeometry->Compose(childImageGeometry->GetIndexToWorldTransform(), 1);

        // in the end, go back to world space
        childGeometry->Compose(m_GeometryItkPhysicalToWorldTransform, 0);  

#else     
        childGeometry->Compose(childImageGeometry->GetIndexToWorldTransform(), 1);
#endif
      }
    }

    mitk::RenderingManager::GetInstance()->RequestUpdateAll();
  }
  emit OptimizerChanged(value);
}
void QmitkRigidRegistrationSelectorView::StopOptimization ( bool  stopOptimization ) [slot]
void QmitkRigidRegistrationSelectorView::TransformChanged (  ) [signal]
void QmitkRigidRegistrationSelectorView::TransformSelected ( int  transform ) [protected, slot]

this method is called whenever the combobox with the selectable transforms changes responsible for showing the selected transformparameters

this method is called whenever the combobox with the selectable transforms changes responsible for showing the selected transform parameters

Definition at line 473 of file QmitkRigidRegistrationSelectorView.cpp.

References m_Controls, m_FixedNode, m_MovingNode, Ui_QmitkRigidRegistrationSelector::m_OptimizerWidgetStack, Ui_QmitkRigidRegistrationSelector::m_TransformWidgetStack, and OptimizerSelected().

Referenced by DoLoadRigidRegistrationPreset(), QmitkRigidRegistrationSelectorView(), SetFixedMaskNode(), SetMovingMaskNode(), and SetMovingNode().

{
  if (m_FixedNode.IsNotNull())
  {
    dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->widget(transform))->SetFixedImage(dynamic_cast<mitk::Image*>(m_FixedNode->GetData()));
  }
  if (m_MovingNode.IsNotNull())
  {
    dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->widget(transform))->SetMovingImage(dynamic_cast<mitk::Image*>(m_MovingNode->GetData()));
  }
  int numberOfTransformParameters = dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->widget(transform))->GetNumberOfTransformParameters();
  dynamic_cast<QmitkRigidRegistrationOptimizerGUIBase*>(m_Controls.m_OptimizerWidgetStack->currentWidget())->SetNumberOfTransformParameters(numberOfTransformParameters);

  //set fixed height
  m_Controls.m_TransformWidgetStack->setFixedHeight( dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->widget(transform))->minimumSizeHint().height() );
  this->OptimizerSelected(m_Controls.m_OptimizerWidgetStack->currentIndex());
}

Member Data Documentation

Definition at line 98 of file QmitkRigidRegistrationSelectorView.h.

Referenced by SetFixedDimension().

mitk::Geometry3D::TransformType::Pointer QmitkRigidRegistrationSelectorView::m_GeometryItkPhysicalToWorldTransform [protected]
mitk::Geometry3D::TransformType::Pointer QmitkRigidRegistrationSelectorView::m_GeometryWorldToItkPhysicalTransform [protected]

Definition at line 99 of file QmitkRigidRegistrationSelectorView.h.

Referenced by SetMovingDimension().

mitk::DataStorage::SetOfObjects::ConstPointer QmitkRigidRegistrationSelectorView::m_MovingNodeChildren [protected]

Definition at line 100 of file QmitkRigidRegistrationSelectorView.h.

Referenced by SetOptimizerValue(), and StopOptimization().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines