Я разрабатываю программу для артиста, которому нужен фон, на котором запущены различные программы через openFrameworks. Ему нужен способ, чтобы легко переключаться между ними. Есть ли какой-нибудь способ создания мастер-оболочки, которая загружает или выгружает другие файлы openframeworks?
Если у вас есть способ завершить RunApp () со стороны клиента (через кнопку выхода), вы можете заключить вызов в язык сценариев через tcl или python. В итоге вы получите интерактивную оболочку, в которой вы сможете запускать различные приложения и устанавливать параметры.
Для простоты я опущу некоторые детали и предположу, что мы делаем связывание языка с boost :: python. Более подробно об этом читайте в этом статья, документация boost :: python Вот.
Основная идея заключается в создании предметно-ориентированного языка / набора оболочек для OF, которые можно использовать для создания объектов OF и доступа к их методам. интерактивно через оболочку или же через скрипт.
Привязка объектов Boost работает примерно так (цитата из 1):
Сначала определите класс в C ++
struct World
{
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};
Затем выставьте его как Python-модуль
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(hello)
{
class_<World>("World")
.def("greet", &World::greet)
.def("set", &World::set)
;
}
Который похож на это при использовании в интерактивной сессии Python:
>>> import hello
>>> planet = hello.World()
>>> planet.set('howdy')
>>> planet.greet()
'howdy'
Теперь, поскольку можно обернуть любой класс или метод, существует множество возможностей для того, чтобы фактически использовать OF. Тот, на кого я ссылался в этом ответе, должен был иметь f.e. два приложения, App1
, App2
реализовано в C ++ / OF, затем ссылка на эту реализацию в python.
Интерактивный сеанс будет выглядеть примерно так:
>>> import myofapps
>>> a1 = myofapps.App1()
>>> a2 = myofapps.App2()
>>> a1.run() # blocked here, until the app terminates
>>> a2.run() # then start next app .. and so forth
>>> a1.run()
Я не хакер OF, но другой (более простой) возможностью может быть интерактивное изменение содержания f.e. ofApp::draw()
в приложении (работает в потоке). Это может быть сделано путем встраивания настраиваемого объекта, параметризуемого из интерпретатора Python:
/// custom configurator class
class MyObj {
private int colorRed;
// getter
int getRed () {
return colorRed;
}
// setter
void setRed(int r) {
colorRed = r;
}
/// more getters/setters code
...
};
/// the boost wrapping code (see top of post)
...
/// OF code here
void testApp::draw() {
// grab a reference to MyObj (there are multiple ways to do that)
// let's assume there's a singleton which holds the reference to it
MyObj o = singleton.getMyObj();
// grab values
int red = o.getRed ();
// configure color
ofSetColor(red,0,0,100);
// other OF drawing code here...
}
Как только приложение OF будет запущено, оно может быть использовано для интерактивного изменения цвета из вашего интерпретатора:
>>> import myofapps
>>> a1 = myofapps.App1()
>>> c1 = myofapps.MyObj();
>>> a1.run() # this call would have to be made non-blocking by running the
>>> # app in a thread and returning right away
>>> c1.setRed(100);
... after a minute set color to a different value
>>>> c1.setRed(200);
Других решений пока нет …