/*
-----------------------------------------------------------------------
Copyright: 2010-2015, iMinds-Vision Lab, University of Antwerp
2014-2015, CWI, Amsterdam
Contact: astra@uantwerpen.be
Website: http://sf.net/projects/astra-toolbox
This file is part of the ASTRA Toolbox.
The ASTRA Toolbox is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
The ASTRA Toolbox 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with the ASTRA Toolbox. If not, see .
-----------------------------------------------------------------------
$Id$
*/
#ifdef ASTRA_PYTHON
#include "astra/PluginAlgorithm.h"
#include
#include
#include
#include
#include
#include
namespace astra {
CPluginAlgorithm::CPluginAlgorithm(PyObject* pyclass){
instance = PyObject_CallObject(pyclass, NULL);
}
CPluginAlgorithm::~CPluginAlgorithm(){
if(instance!=NULL){
Py_DECREF(instance);
instance = NULL;
}
}
bool CPluginAlgorithm::initialize(const Config& _cfg){
if(instance==NULL) return false;
PyObject *cfgDict = XMLNode2dict(_cfg.self);
PyObject *retVal = PyObject_CallMethod(instance, "astra_init", "O",cfgDict);
Py_DECREF(cfgDict);
if(retVal==NULL) return false;
m_bIsInitialized = true;
Py_DECREF(retVal);
return m_bIsInitialized;
}
void CPluginAlgorithm::run(int _iNrIterations){
if(instance==NULL) return;
PyObject *retVal = PyObject_CallMethod(instance, "astra_run", "i",_iNrIterations);
if(retVal==NULL) return;
Py_DECREF(retVal);
}
const char ps =
#ifdef _WIN32
'\\';
#else
'/';
#endif
std::vector CPluginAlgorithmFactory::getPluginPathList(){
std::vector list;
list.push_back("/etc/astra-toolbox");
PyObject *ret, *retb;
ret = PyObject_CallMethod(inspect,"getfile","O",astra);
if(ret!=NULL){
retb = PyObject_CallMethod(six,"b","O",ret);
Py_DECREF(ret);
if(retb!=NULL){
std::string astra_inst (PyBytes_AsString(retb));
Py_DECREF(retb);
ret = PyObject_CallMethod(ospath,"dirname","s",astra_inst.c_str());
if(ret!=NULL){
retb = PyObject_CallMethod(six,"b","O",ret);
Py_DECREF(ret);
if(retb!=NULL){
list.push_back(std::string(PyBytes_AsString(retb)));
Py_DECREF(retb);
}
}
}
}
ret = PyObject_CallMethod(ospath,"expanduser","s","~");
if(ret!=NULL){
retb = PyObject_CallMethod(six,"b","O",ret);
Py_DECREF(ret);
if(retb!=NULL){
list.push_back(std::string(PyBytes_AsString(retb)) + ps + ".astra-toolbox");
Py_DECREF(retb);
}
}
const char *envval = getenv("ASTRA_PLUGIN_PATH");
if(envval!=NULL){
list.push_back(std::string(envval));
}
return list;
}
CPluginAlgorithmFactory::CPluginAlgorithmFactory(){
Py_Initialize();
pluginDict = PyDict_New();
ospath = PyImport_ImportModule("os.path");
inspect = PyImport_ImportModule("inspect");
six = PyImport_ImportModule("six");
astra = PyImport_ImportModule("astra");
std::vector fls = getPluginPathList();
std::vector items;
for(unsigned int i=0;i items;
boost::split(items, str, boost::is_any_of("."));
PyObject *pyclass = PyImport_ImportModule(items[0].c_str());
if(pyclass==NULL) return NULL;
PyObject *submod = pyclass;
for(unsigned int i=1;i= 3
PyObject * pyStringFromString(std::string str){
return PyUnicode_FromString(str.c_str());
}
#else
PyObject * pyStringFromString(std::string str){
return PyBytes_FromString(str.c_str());
}
#endif
PyObject* stringToPythonValue(std::string str){
if(str.find(";")!=std::string::npos){
std::vector rows, row;
boost::split(rows, str, boost::is_any_of(";"));
PyObject *mat = PyList_New(rows.size());
for(unsigned int i=0; i(row[j])));
}
PyList_SetItem(mat, i, rowlist);
}
return mat;
}
if(str.find(",")!=std::string::npos){
std::vector vec;
boost::split(vec, str, boost::is_any_of(","));
PyObject *veclist = PyList_New(vec.size());
for(unsigned int i=0;i(vec[i])));
}
return veclist;
}
try{
return PyLong_FromLong(boost::lexical_cast(str));
}catch(const boost::bad_lexical_cast &){
try{
return PyFloat_FromDouble(boost::lexical_cast(str));
}catch(const boost::bad_lexical_cast &){
return pyStringFromString(str);
}
}
}
PyObject* XMLNode2dict(XMLNode node){
PyObject *dct = PyDict_New();
PyObject *opts = PyDict_New();
if(node.hasAttribute("type")){
PyObject *obj = pyStringFromString(node.getAttribute("type").c_str());
PyDict_SetItemString(dct, "type", obj);
Py_DECREF(obj);
}
std::list nodes = node.getNodes();
std::list::iterator it = nodes.begin();
while(it!=nodes.end()){
XMLNode subnode = *it;
if(subnode.getName()=="Option"){
PyObject *obj;
if(subnode.hasAttribute("value")){
obj = stringToPythonValue(subnode.getAttribute("value"));
}else{
obj = stringToPythonValue(subnode.getContent());
}
PyDict_SetItemString(opts, subnode.getAttribute("key").c_str(), obj);
Py_DECREF(obj);
}else{
PyObject *obj = stringToPythonValue(subnode.getContent());
PyDict_SetItemString(dct, subnode.getName().c_str(), obj);
Py_DECREF(obj);
}
++it;
}
PyDict_SetItemString(dct, "options", opts);
Py_DECREF(opts);
return dct;
}
}
#endif