File: core_utils.cpp

package info (click to toggle)
camitk 6.0.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 389,496 kB
  • sloc: cpp: 103,476; sh: 2,448; python: 1,618; xml: 984; makefile: 128; perl: 84; sed: 20
file content (95 lines) | stat: -rw-r--r-- 3,508 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*****************************************************************************
 * $CAMITK_LICENCE_BEGIN$
 *
 * CamiTK - Computer Assisted Medical Intervention ToolKit
 * (c) 2001-2025 Univ. Grenoble Alpes, CNRS, Grenoble INP - UGA, TIMC, 38000 Grenoble, France
 *
 * Visit http://camitk.imag.fr for more information
 *
 * This file is part of CamiTK.
 *
 * CamiTK is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * CamiTK is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with CamiTK.  If not, see <http://www.gnu.org/licenses/>.
 *
 * $CAMITK_LICENCE_END$
 ****************************************************************************/

#include "core_utils.h"

#include <ImageComponent.h>
#include <MeshComponent.h>

namespace py = pybind11;

namespace pybind11::detail {

// --------------- ComponentList ---------------
// Conversion from Python PyObject to C++ ComponentList
bool type_caster<camitk::ComponentList>::load(handle src, bool /* not used : indicates whether implicit conversions should be applied */) {
    // Accept list or tuple
    if (!py::isinstance<py::sequence>(src)) {
        return false;
    }
    py::sequence seq = reinterpret_borrow<py::sequence>(src);
    value.clear();
    for (auto comp : seq) {
        if (comp.is_none()) {
            value.append(nullptr);
        }
        else {
            camitk::Component* ptr = nullptr;

            // Try casting to camitk::Component
            try {
                ptr = comp.cast<camitk::Component*>();
            }
            catch (const py::cast_error&) {
                return false;  // Invalid item in list
            }

            value.append(ptr);
        }
    }

    return true;
}


// Conversion from C++ ComponentList to Python PyObject
handle type_caster<camitk::ComponentList>::cast(const camitk::ComponentList& list, return_value_policy /* policy */, handle /* parent */) {
    py::list pyList;

    for (camitk::Component* c : list) {
        // Dynamic cast must be used here as, for instance, the fact that VtkImageComponent inherits from ImageComponent
        // is not known/declared to pybind, which cannot cast properly and therefore remove the polymorphism in python
        // and from python get_image_data won't work
        camitk::ImageComponent* img = dynamic_cast<camitk::ImageComponent*>(c);
        if (img != nullptr) {
            pyList.append(py::cast(img, py::return_value_policy::reference));
        }
        else {
            camitk::MeshComponent* msh = dynamic_cast<camitk::MeshComponent*>(c);
            if (msh != nullptr) {
                pyList.append(py::cast(msh, py::return_value_policy::reference));
            }
            else {
                // py::return_value_policy::take_ownership is needed to ensure that pybind11 infers polymorphic return types correctly (Component, ImageComponent, MeshComponent...)
                pyList.append(py::cast(c, py::return_value_policy::reference));  // <- this will do the dynamic cast
            }
        }
    }

    return pyList.release();
}

} // namespace pybind11::detail