Program Listing for File vtkMRMLLayerDMPipelineScriptedCreator.cxx

Return to documentation for file (MRMLDM/vtkMRMLLayerDMPipelineScriptedCreator.cxx)

#include "vtkMRMLLayerDMPipelineScriptedCreator.h"

// Layer DM includes
#include "vtkMRMLLayerDMPipelineI.h"
#include "vtkMRMLLayerDMPythonUtil.h"

// Slicer includes
#include "vtkMRMLAbstractViewNode.h"
#include "vtkMRMLNode.h"

// VTK includes
#include <vtkObjectFactory.h>
#include <vtkPythonUtil.h>

vtkStandardNewMacro(vtkMRMLLayerDMPipelineScriptedCreator);

vtkMRMLLayerDMPipelineScriptedCreator::vtkMRMLLayerDMPipelineScriptedCreator()
  : m_object(nullptr)
{
  this->SetCallback(
    [this](vtkMRMLAbstractViewNode* viewNode, vtkMRMLNode* node) -> vtkSmartPointer<vtkMRMLLayerDMPipelineI>
    {
      if (!vtkMRMLLayerDMPythonUtil::IsValidPythonContext())
      {
        return nullptr;
      }

      vtkPythonScopeGilEnsurer gilEnsurer;
      PyObject* result = vtkMRMLLayerDMPythonUtil::CallPythonObject(
        this->m_object, vtkMRMLLayerDMPythonUtil::ToPyArgs({ vtkMRMLLayerDMPythonUtil::ToPyObject(viewNode), vtkMRMLLayerDMPythonUtil::ToPyObject(node) }));
      if (!result)
      {
        auto errorMsg = std::string(__func__) + ": Failed to call : " + vtkMRMLLayerDMPythonUtil::GetObjectStr(this->m_object) + ":";
        vtkMRMLLayerDMPythonUtil::PrintErrorTraceback(this, errorMsg);
        return nullptr;
      }
      return vtkMRMLLayerDMPipelineI::SafeDownCast(vtkPythonUtil::GetPointerFromObject(result, "vtkMRMLLayerDMPipelineI"));
    });
}

vtkMRMLLayerDMPipelineScriptedCreator::~vtkMRMLLayerDMPipelineScriptedCreator()
{
  vtkMRMLLayerDMPythonUtil::DeletePythonObject(&this->m_object);
}

void vtkMRMLLayerDMPipelineScriptedCreator::SetPythonCallback(PyObject* object)
{
  vtkMRMLLayerDMPythonUtil::SetPythonObject(&this->m_object, object);
}