51 if(!p.ossia_state.impl)
61 std::vector<std::string> results;
62 boost::split(results, value, [](
char c){
return c ==
'\n' || c ==
'\r'; });
64 for(
auto& res : results) {
66 if(
auto path = ossia::traversal::make_path(res))
68 p.m_paths.push_back(std::move(*path));
80 auto& p = *current_object;
81 ossia::execution_state& st = *p.ossia_state.impl;
82 const auto& rdev = st.exec_devices();
88 auto& observed = observer.devices;
91 if(observed.find(dev) == observed.end())
94 dev->on_node_created.connect<&PatternDeviceObserver::mark_dirty>(observer);
95 dev->on_node_removing.connect<&PatternDeviceObserver::mark_dirty>(observer);
97 p.roots.push_back(&dev->get_root_node());
102 for(
auto it = observed.begin(); it != observed.end();)
104 if(!ossia::contains(rdev, *it))
105 it = observed.erase(it);
110 const auto orig_roots = p.roots;
111 std::vector<ossia::net::node_base*> result;
112 std::vector<ossia::net::node_base*> total;
113 for(
auto& path : p.m_paths) {
114 result.assign(orig_roots.begin(), orig_roots.end());
116 ossia::traversal::apply(path, result);
117 total.insert(total.end(), result.begin(), result.end());
120 ossia::remove_duplicates(total);
123 [](ossia::net::node_base* lhs, ossia::net::node_base* rhs) {
127 std::swap(p.roots, total);
129 observer.dirty =
false;
138 halp_meta(name,
"Pattern applier")
139 halp_meta(author,
"ossia team")
140 halp_meta(category,
"Control/Data Processing")
141 halp_meta(description,
"Send a message to all nodes matching a pattern")
142 halp_meta(c_name,
"avnd_pattern_apply")
143 halp_meta(uuid,
"44a55ee1-c2c9-43d5-a655-8eaedaff394c")
144 halp_meta(manual_url,
"https://ossia.io/score-docs/processes/pattern-applier.html#pattern-applier")
148 halp::val_port<
"Input", ossia::value> input;
162 auto process = [
this](
const std::vector<ossia::value>& vec) {
163 const auto N = std::min(roots.size(), vec.size());
164 for(std::size_t i = 0; i < N; i++)
166 if(
auto p = roots[i]->get_parameter())
168 p->push_value(vec[i]);
173 if(
auto vvec = inputs.input.value.target<std::vector<ossia::value>>())
179 process(ossia::convert<std::vector<ossia::value>>(inputs.input.value));