diff options
author | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2018-07-03 14:32:23 +0200 |
---|---|---|
committer | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2018-07-03 14:32:23 +0200 |
commit | 0d06afc38d7a8443a079d25d72ec4b4b15353974 (patch) | |
tree | 9a866e41d62d0432bad4dd49e4072cc2fed97d29 /python/astra | |
parent | b3822b778c2f8684217957c966dddfee178c926c (diff) | |
download | astra-0d06afc38d7a8443a079d25d72ec4b4b15353974.tar.gz astra-0d06afc38d7a8443a079d25d72ec4b4b15353974.tar.bz2 astra-0d06afc38d7a8443a079d25d72ec4b4b15353974.tar.xz astra-0d06afc38d7a8443a079d25d72ec4b4b15353974.zip |
Allow access to python plugin object via algorithm interface
Diffstat (limited to 'python/astra')
-rw-r--r-- | python/astra/algorithm.py | 11 | ||||
-rw-r--r-- | python/astra/algorithm_c.pyx | 17 | ||||
-rw-r--r-- | python/astra/src/PythonPluginAlgorithm.cpp | 8 | ||||
-rw-r--r-- | python/astra/src/PythonPluginAlgorithm.h | 3 |
4 files changed, 39 insertions, 0 deletions
diff --git a/python/astra/algorithm.py b/python/astra/algorithm.py index 33cca85..8862af3 100644 --- a/python/astra/algorithm.py +++ b/python/astra/algorithm.py @@ -66,6 +66,17 @@ def delete(ids): """ return a.delete(ids) +def get_plugin_object(i): + """Return the Python object instance of a plugin algorithm. + + :param i: ID of object corresponding to a plugin algorithm. + :type i: :class:`int` + :returns: The Python object instance of the plugin algorithm. + + """ + return a.get_plugin_object(i) + + def clear(): """Clear all matrix objects.""" return a.clear() diff --git a/python/astra/algorithm_c.pyx b/python/astra/algorithm_c.pyx index a190ee1..50f6052 100644 --- a/python/astra/algorithm_c.pyx +++ b/python/astra/algorithm_c.pyx @@ -47,6 +47,13 @@ cdef extern from *: CReconstructionAlgorithm2D * dynamic_cast_recAlg2D "dynamic_cast<astra::CReconstructionAlgorithm2D*>" (CAlgorithm * ) CReconstructionAlgorithm3D * dynamic_cast_recAlg3D "dynamic_cast<astra::CReconstructionAlgorithm3D*>" (CAlgorithm * ) +cdef extern from "src/PythonPluginAlgorithm.h" namespace "astra": + cdef cppclass CPluginAlgorithm: + object getInstance() + +cdef extern from *: + CPluginAlgorithm * dynamic_cast_PluginAlg "dynamic_cast<astra::CPluginAlgorithm*>" (CAlgorithm * ) + def create(config): cdef Config * cfg = utils.dictToConfig(six.b('Algorithm'), config) @@ -104,6 +111,16 @@ def delete(ids): manAlg.remove(ids) +def get_plugin_object(algorithm_id): + cdef CAlgorithm *alg + cdef CPluginAlgorithm *pluginAlg + alg = getAlg(algorithm_id) + pluginAlg = dynamic_cast_PluginAlg(alg) + if not pluginAlg: + raise Exception("Not a plugin algorithm") + return pluginAlg.getInstance() + + def clear(): manAlg.clear() diff --git a/python/astra/src/PythonPluginAlgorithm.cpp b/python/astra/src/PythonPluginAlgorithm.cpp index d461f06..3c892ff 100644 --- a/python/astra/src/PythonPluginAlgorithm.cpp +++ b/python/astra/src/PythonPluginAlgorithm.cpp @@ -124,6 +124,14 @@ void CPluginAlgorithm::run(int _iNrIterations){ PyGILState_Release(state); } +PyObject *CPluginAlgorithm::getInstance() const { + if (instance) + Py_INCREF(instance); + return instance; +} + + + CPythonPluginAlgorithmFactory::CPythonPluginAlgorithmFactory(){ if(!Py_IsInitialized()){ Py_Initialize(); diff --git a/python/astra/src/PythonPluginAlgorithm.h b/python/astra/src/PythonPluginAlgorithm.h index 947e30d..b7072d6 100644 --- a/python/astra/src/PythonPluginAlgorithm.h +++ b/python/astra/src/PythonPluginAlgorithm.h @@ -49,6 +49,9 @@ public: bool initialize(const Config& _cfg); void run(int _iNrIterations); + // Return instance (including INCREF) + PyObject *getInstance() const; + private: PyObject * instance; |