35#ifndef NEKTAR_FIELDUTILS_PYTHON_VTKWRAPPER_HPP
36#define NEKTAR_FIELDUTILS_PYTHON_VTKWRAPPER_HPP
38#include <vtkObjectBase.h>
39#include <vtkSmartPointer.h>
40#include <vtkVersion.h>
55struct type_caster<T, enable_if_t<
std::is_base_of_v<vtkObjectBase, T>>>
62 static constexpr auto name = _<T>();
64 bool load(handle src,
bool)
66 std::string thisStr =
"__this__";
68 PyObject *obj = src.ptr();
71 if (!PyObject_HasAttrString(obj, thisStr.c_str()))
76 PyObject *thisAttr = PyObject_GetAttrString(obj, thisStr.c_str());
77 if (thisAttr ==
nullptr)
82 std::string str = PyUnicode_AsUTF8(thisAttr);
89 auto iter = str.find(
"_p_vtk");
90 if (iter == std::string::npos)
95 auto className = str.substr(iter).find(
"vtk");
96 if (className == std::string::npos)
101 long address = stol(str.substr(1, 17));
102 vtkObjectBase *vtkObject = (vtkObjectBase *)((
void *)address);
104 if (vtkObject->IsA(str.substr(className).c_str()))
113 static handle
cast(
const T *src, return_value_policy policy, handle parent)
117 return none().release();
120 std::ostringstream oss;
121 oss << (vtkObjectBase *)src;
122 std::string address_str = oss.str();
126 py::object obj = py::module_::import(
"vtkmodules.vtkCommonCore")
127 .attr(
"vtkObjectBase")(address_str);
128 return obj.release();
130 catch (py::error_already_set &)
140 py::module_::import(
"vtk").attr(
"vtkObjectBase")(address_str);
141 return obj.release();
143 catch (py::error_already_set &)
146 throw NekError(
"Unable to import VTK.");
150 return none().release();
158 using Class = intrinsic_t<decltype(*std::declval<Ptr>())>;
162 static constexpr auto name = _<Class>();
163 static handle
cast(
const Ptr &ptr, return_value_policy policy,
166 return value_caster_type::cast(*ptr, policy, parent);
172template <
typename Ptr>
178 using Class = intrinsic_t<decltype(*std::declval<Ptr>())>;
189 return std::move(
value);
192 template <
typename T_>
195 bool load(handle src,
bool convert)
198 if (!value_caster.load(src, convert))
207template <
typename Class>
208struct type_caster<vtkSmartPointer<
Class>>
213template <
typename Class>
Nektar::ErrorUtil::NekError NekError
static handle cast(const T *src, return_value_policy policy, handle parent)
bool load(handle src, bool)
VTK Pointer-like object - copyable / movable.
bool load(handle src, bool convert)
pybind11::detail::movable_cast_op_type< T_ > cast_op_type
VTK Pointer-like object - may be non-copyable.
static handle cast(const Ptr &ptr, return_value_policy policy, handle parent)
type_caster< Class > value_caster_type
static constexpr auto name