1 #include <pybind11/eval.h> 2 #include <filesystem> 3 4 #include "configfile.py.h" 5 #include "configfile.h" 6 #include "plugin.py.h" 7 8 namespace fs = std::filesystem; 9 config(py::module & m,ConfigState & state)10void Vipster::Py::config(py::module& m, ConfigState& state){ 11 m.attr("PeriodicTable") = std::get<0>(state); 12 m.attr("Parameters") = py::cast(std::get<3>(state), py::return_value_policy::reference); 13 m.attr("Presets") = py::cast(std::get<4>(state), py::return_value_policy::reference); 14 auto& plugins = std::get<2>(state); 15 auto& params = std::get<3>(state); 16 auto& presets = std::get<4>(state); 17 // try to parse python-based plugins 18 auto pluginDir = getConfigDir()/"plugins"; 19 if(fs::exists(pluginDir)){ 20 for(const auto& file: fs::directory_iterator(pluginDir)){ 21 if(file.path().extension() != ".py") continue; 22 auto plug = Plugin::create(file); 23 if(plug){ 24 std::cerr << "Loading Python-plugin " << file.path() << std::endl; 25 plugins.push_back(plug); 26 if(plug->makeParam){ 27 params[plug]["default"] = plug->makeParam(); 28 } 29 if(plug->makePreset){ 30 presets[plug]["default"] = plug->makePreset(); 31 } 32 } 33 } 34 } 35 // expose plugins 36 auto plug = m.def_submodule("Plugins"); 37 for(const Vipster::Plugin* p: plugins){ 38 plug.attr(p->command.c_str()) = p; 39 } 40 } 41