загрузка — c ++ / openframeworks — как переключаться между открытыми фреймворками программ

Я разрабатываю программу для артиста, которому нужен фон, на котором запущены различные программы через openFrameworks. Ему нужен способ, чтобы легко переключаться между ними. Есть ли какой-нибудь способ создания мастер-оболочки, которая загружает или выгружает другие файлы openframeworks?

1

Решение

Если у вас есть способ завершить 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);
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]