PropertyDefinitionVisitors.cpp
Go to the documentation of this file.
1/*
2 * This file is part of ArmarX.
3 *
4 * ArmarX is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * ArmarX is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * @package robdekon
17 * @author Christoph Pohl ( christoph dot pohl at kit dot edu )
18 * @date 06.09.22
19 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20 * GNU General Public License
21 */
22
24
25#include <SimoxUtility/algorithm/string/string_conversion_eigen.h>
26#include <SimoxUtility/algorithm/string/string_tools.h>
27
31
35
36#include "Util.h"
37
38#define INPUT_GUARD(i) \
39 ARMARX_TRACE; \
40 ARMARX_CHECK_NOT_NULL(i); \
41 if (in_list_) \
42 return;
43
44inline std::string
45joinNamespaces(const std::vector<std::string>& namespaces)
46{
47 std::string result = "";
48 std::for_each(
49 namespaces.begin(), namespaces.end(), [&result](const auto& i) { result += i + "."; });
50 return result;
51}
52
54{
55
56 void
58 {
59 INPUT_GUARD(i);
60 auto value = data::Int::DynamicCastAndCheck(i);
61 auto name = global_namespace_ + pathToName(i);
62 property_user_->getProperty(value->getValue(), name);
63 }
64
65 void
67 {
68 INPUT_GUARD(f);
70 auto name = global_namespace_ + pathToName(f);
71 property_user_->getProperty(value->getValue(), name);
72 }
73
74 void
76 {
77 INPUT_GUARD(d);
79 auto name = global_namespace_ + pathToName(d);
80 property_user_->getProperty(value->getValue(), name);
81 }
82
83 void
85 {
86 INPUT_GUARD(b);
87 auto value = data::Bool::DynamicCastAndCheck(b);
88 auto name = global_namespace_ + pathToName(b);
89 property_user_->getProperty(value->getValue(), name);
90 }
91
92 void
94 {
95 INPUT_GUARD(string);
96 auto value = data::String::DynamicCastAndCheck(string);
97 auto name = global_namespace_ + pathToName(string);
98 auto property = property_user_->getProperty<std::string>(name);
99 if (not property.getValue().empty())
100 {
101 value->getValue() = property.getValueAndReplaceAllVars();
102 }
103 else
104 {
105 value->getValue() = "";
106 }
107 }
108
109 void
111 {
113 in_list_ = true;
114 const auto& name = global_namespace_ + pathToName(o);
115 const auto& type = type::List::DynamicCast(t)->getAcceptedType()->getDescriptor();
116 if (std::find(implementedListDescriptors.begin(), implementedListDescriptors.end(), type) ==
117 implementedListDescriptors.end())
118 {
119 return;
120 }
121 auto old_list = data::List::DynamicCast(o);
122 old_list->clear();
123 auto get_list = [this, &name]() -> std::vector<std::string>
124 {
125 std::string list;
126 property_user_->getProperty(list, name);
127 return simox::alg::split(list, ",");
128 };
129 int i = 0;
130 std::vector<std::string> vector = get_list();
131 std::for_each(vector.begin(),
132 vector.end(),
133 [&old_list, &i, &type](const auto& el)
134 {
135 old_list->addElement(factories::VariantHelper::make(type)->from_string(
136 el, old_list->getPath().withIndex(i)));
137 i++;
138 });
139 }
140
141 void
143 {
144 in_list_ = false;
145 }
146
147 void
149 {
151 auto data = data::Int::DynamicCastAndCheck(enumData);
152 auto name = global_namespace_ + pathToName(enumData);
153 property_user_->getProperty(data->getValue(), name);
154 }
155
156 void
158 {
159 ARMARX_WARNING << "Unknown data encountered: "
160 << (unknown ? unknown->getFullName() : "nullptr");
161 }
162
164 const armarx::PropertyUser& defs,
165 const std::string& globalNamespace) :
166 property_user_(std::experimental::make_observer(&defs)),
167 global_namespace_(globalNamespace),
168 in_list_(false)
169 {
170 }
171
172 void
174 {
176 in_list_ = true;
177 const auto& name = global_namespace_ + pathToName(o);
178 const auto& type = type::Dict::DynamicCast(t)->getAcceptedType()->getDescriptor();
179 if (std::find(implementedListDescriptors.begin(), implementedListDescriptors.end(), type) ==
180 implementedListDescriptors.end())
181 {
182 return;
183 }
184 auto old_dict = data::Dict::DynamicCast(o);
185 old_dict->clear();
186 auto get_list = [this, &name]() -> std::vector<std::string>
187 {
188 std::string list;
189 property_user_->getProperty(list, name);
190 return simox::alg::split(list, ",");
191 };
192 std::vector<std::string> vector = get_list();
193 std::for_each(
194 vector.begin(),
195 vector.end(),
196 [&old_dict, &type](const auto& el)
197 {
198 auto key_value = simox::alg::split(el, ":");
199 old_dict->addElement(
200 key_value.front(),
201 factories::VariantHelper::make(type)->from_string(
202 key_value.back(), old_dict->getPath().withElement(key_value.front())));
203 });
204 }
205
206 void
208 TypeInput& /*elementType*/)
209 {
210 in_list_ = false;
211 }
212
218
224
230
236
242
248
249 void
251 {
252 INPUT_GUARD(matrix);
254 const auto name = global_namespace_ + pathToName(matrix);
255 const std::string property = property_user_->getProperty<std::string>(name).getValue();
256 const auto vec = simox::alg::to_eigen_vec(property, ", ");
257 ARMARX_CHECK_EQUAL(sizeof(float) * vec.size(), data->getDataAsVector().size())
258 << "Matrix recovered from properties does not match the aron type";
259
260 data->setData(data->getDataAsVector().size(),
261 reinterpret_cast<const unsigned char*>(vec.data()));
262 }
263
264 void
266 {
267 INPUT_GUARD(quaternion);
268 auto value = data::NDArray::DynamicCastAndCheck(quaternion);
269 auto name = global_namespace_ + pathToName(quaternion);
270 const std::string property = property_user_->getProperty<std::string>(name).getValue();
271 const Eigen::Quaternion quat(simox::alg::to_eigen_vec(property, ", ").data());
273 value->setData(newQuat->getDataAsVector().size(), newQuat->getData());
274 }
275
276 void
278 {
279 INPUT_GUARD(i);
280 if (global_namespace_.empty())
281 {
283 global_namespace_ = t->getObjectNameWithoutNamespace() + ".";
284 }
285 }
286
288 const PropertyDefinitionsPtr& defs,
289 const std::string& globalNamespace) :
290 property_definitions_(std::experimental::make_observer(defs.get())),
291 global_namespace_(globalNamespace)
292 {
293 }
294
295 void
297 const type::IntPtr& /*unused*/)
298 {
299 INPUT_GUARD(i);
300 auto name = global_namespace_ + pathToName(i);
301 property_definitions_->defineOptionalProperty<int>(name, i->getValue());
302 }
303
304 void
306 const type::FloatPtr& /*unused*/)
307 {
308 INPUT_GUARD(f);
309 auto name = global_namespace_ + pathToName(f);
310 property_definitions_->defineOptionalProperty<float>(name, f->getValue());
311 }
312
313 void
315 const type::DoublePtr& /*unused*/)
316 {
317 INPUT_GUARD(d);
318 auto name = global_namespace_ + pathToName(d);
319 property_definitions_->defineOptionalProperty<double>(name, d->getValue());
320 }
321
322 void
324 const type::BoolPtr& /*unused*/)
325 {
326 INPUT_GUARD(b);
327 auto name = global_namespace_ + pathToName(b);
328 property_definitions_->defineOptionalProperty<bool>(name, b->getValue());
329 }
330
331 void
333 const type::StringPtr& /*type*/)
334 {
335 INPUT_GUARD(string);
336 auto name = global_namespace_ + pathToName(string);
337 property_definitions_->defineOptionalProperty<std::string>(name, string->getValue());
338 }
339
340 void
342 const type::IntEnumPtr& t)
343 {
344 INPUT_GUARD(i);
345 auto name = global_namespace_ + pathToName(i);
346 property_definitions_->defineOptionalProperty<int>(name, i->getValue())
347 .map(t->getAcceptedValueMap());
348 }
349
350 void
352 const type::ListPtr& t)
353 {
356 in_list_ = true;
357 const auto& name = global_namespace_ + pathToName(l);
358 const auto& type = t->getAcceptedType()->getDescriptor();
359 if (std::find(implementedListDescriptors.begin(), implementedListDescriptors.end(), type) ==
360 implementedListDescriptors.end())
361 {
362 return;
363 }
364 const auto& input = l->getElements();
365 std::string str;
366 std::vector<std::string> vector;
367 std::transform(input.begin(),
368 input.end(),
369 std::back_inserter(vector),
370 [&type](const auto& el)
371 { return factories::VariantHelper::make(type)->to_string(el); });
372 str = simox::alg::to_string(vector, ", ");
373 property_definitions_->defineOptionalProperty<std::string>(name, str);
374 }
375
376 void
378 const type::ListPtr& /*unused*/)
379 {
380 in_list_ = false;
381 }
382
383 void
385 const type::DictPtr& t)
386 {
388 in_list_ = true;
389 const auto& name = global_namespace_ + pathToName(d);
390 const auto& type = t->getAcceptedType()->getDescriptor();
391 if (std::find(implementedListDescriptors.begin(), implementedListDescriptors.end(), type) ==
392 implementedListDescriptors.end())
393 {
394 return;
395 }
396 const auto& input = d->getElements();
397 std::stringstream ss;
398 for (const auto& [key, el] : input)
399 {
400 ss << key << ":";
401 ss << factories::VariantHelper::make(type)->to_string(el);
402 ss << ",";
403 }
404 std::string value = ss.str();
405 if (not value.empty())
406 {
407 value.pop_back();
408 }
409 property_definitions_->defineOptionalProperty<std::string>(name, value);
410 }
411
412 void
414 const type::DictPtr& /*unused*/)
415 {
416 in_list_ = false;
417 }
418
419 void
421 const type::ObjectPtr& type)
422 {
423 INPUT_GUARD(obj);
424 if (global_namespace_.empty())
425 {
426 global_namespace_ = type->getObjectNameWithoutNamespace() + ".";
427 }
428 }
429
430 void
432 const type::QuaternionPtr& /*type*/)
433 {
434 INPUT_GUARD(quaternion);
435 auto name = global_namespace_ + pathToName(quaternion);
436 const auto quat =
438 property_definitions_->defineOptionalProperty<std::string>(
439 name, simox::alg::to_string(quat.coeffs(), ", "));
440 }
441
442 void
444 const type::MatrixPtr& /*type*/)
445 {
446 INPUT_GUARD(matrix);
447 auto name = global_namespace_ + pathToName(matrix);
448 auto shape = matrix->getShape();
449 // TODO: why is shape 3 for a matrix?
450 if (shape.size() != 3 or (shape[0] != 1 and shape[1] != 1))
451 {
452 ARMARX_WARNING << "Matrix is not a vector, ignoring";
453 return;
454 }
456 std::string value = "";
457 for (int i = 0; i < shape[0]; i++)
458 {
459 for (int j = 0; j < shape[1]; j++)
460 {
461 value += std::to_string(mat(i, j)) + ", ";
462 }
463 }
464 if (not value.empty())
465 {
466 value.pop_back();
467 value.pop_back();
468 }
469 property_definitions_->defineOptionalProperty<std::string>(name, value);
470 }
471} // namespace armarx::aron::component_config
472
473#undef INPUT_GUARD
#define INPUT_GUARD(i)
std::string joinNamespaces(const std::vector< std::string > &namespaces)
std::string str(const T &t)
static auto make(const type::Descriptor &s, Args &&... args)
Abstract PropertyUser class.
ListElements getListElements(DataInput &o, TypeInput &t) override
type::Descriptor getDescriptor(DataInput &o, TypeInput &t) override
void visitBool(DataInput &elementData, TypeInput &elementType) override
void visitIntEnum(DataInput &elementData, TypeInput &elementType) override
PairElements getPairElements(DataInput &o, TypeInput &t) override
void visitString(DataInput &elementData, TypeInput &elementType) override
void visitInt(DataInput &elementData, TypeInput &elementType) override
void visitDictOnExit(DataInput &elementData, TypeInput &elementType) override
void visitListOnEnter(DataInput &elementData, TypeInput &elementType) override
void visitQuaternion(DataInput &elementData, TypeInput &elementType) override
PropertyDefinitionGetterVisitor(const armarx::PropertyUser &defs, const std::string &global_namespace="")
TupleElements getTupleElements(DataInput &o, TypeInput &t) override
void visitMatrix(DataInput &elementData, TypeInput &elementType) override
void visitUnknown(DataInput &elementData, TypeInput &elementType) override
void visitDictOnEnter(DataInput &elementData, TypeInput &elementType) override
void visitObjectOnEnter(DataInput &elementData, TypeInput &elementType) override
void visitListOnExit(DataInput &elementData, TypeInput &elementType) override
void visitFloat(DataInput &elementData, TypeInput &elementType) override
void visitDouble(DataInput &elementData, TypeInput &elementType) override
void visitAronVariant(const data::IntPtr &, const type::IntEnumPtr &) override
PropertyDefinitionSetterVisitor(const armarx::PropertyDefinitionsPtr &defs, const std::string &global_namespace="")
void visitAronVariantOnExit(const data::ListPtr &, const type::ListPtr &) override
void visitAronVariantOnEnter(const data::ListPtr &, const type::ListPtr &) override
static Eigen::Matrix< T, Rows, Cols > ConvertToMatrix(const data::NDArrayPtr &nav)
static Eigen::Quaternion< T > ConvertToQuaternion(const data::NDArrayPtr &nav)
static data::NDArrayPtr ConvertFromQuaternion(const Eigen::Quaternion< T > &quat)
VariantPtr getAcceptedType() const
Definition Dict.cpp:42
VariantPtr getAcceptedType() const
Definition List.cpp:43
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
#define ARMARX_CHECK_EQUAL(lhs, rhs)
This macro evaluates whether lhs is equal (==) rhs and if it turns out to be false it will throw an E...
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
Definition Logging.h:193
std::pair< std::pair< typename std::remove_const< DataInputT >::type, typename std::remove_const< TypeInputT >::type >, std::pair< typename std::remove_const< DataInputT >::type, typename std::remove_const< TypeInputT >::type > > getPairElements(DataInputT &o, TypeInputT &t)
Definition Util.h:122
std::string pathToName(const std::shared_ptr< data::Variant > &v)
Definition Util.h:36
std::map< std::string, std::pair< typename std::remove_const< DataInputT >::type, typename std::remove_const< TypeInputT >::type > > getObjectElements(DataInputT &o, TypeInputT &t)
Definition Util.h:50
std::vector< std::pair< typename std::remove_const< DataInputT >::type, typename std::remove_const< TypeInputT >::type > > getListElements(DataInputT &o, TypeInputT &t)
Definition Util.h:97
std::map< std::string, std::pair< typename std::remove_const< DataInputT >::type, typename std::remove_const< TypeInputT >::type > > getDictElements(DataInputT &o, TypeInputT &t)
Definition Util.h:73
std::vector< std::pair< typename std::remove_const< DataInputT >::type, typename std::remove_const< TypeInputT >::type > > getTupleElements(DataInputT &o, TypeInputT &t)
Definition Util.h:143
A convenience header to include all aron files (full include, not forward declared)
std::shared_ptr< Dict > DictPtr
Definition Dict.h:42
std::shared_ptr< List > ListPtr
Definition List.h:41
std::shared_ptr< Bool > BoolPtr
std::shared_ptr< Float > FloatPtr
std::shared_ptr< NDArray > NDArrayPtr
Definition NDArray.h:46
std::shared_ptr< Int > IntPtr
std::shared_ptr< Double > DoublePtr
std::shared_ptr< String > StringPtr
A convenience header to include all aron files (full include, not forward declared)
std::shared_ptr< class Quaternion > QuaternionPtr
std::shared_ptr< Object > ObjectPtr
Definition Object.h:36
std::shared_ptr< class Double > DoublePtr
std::shared_ptr< class Matrix > MatrixPtr
std::shared_ptr< class String > StringPtr
std::shared_ptr< class Int > IntPtr
std::shared_ptr< class Float > FloatPtr
std::shared_ptr< class Bool > BoolPtr
std::shared_ptr< class Dict > DictPtr
std::shared_ptr< IntEnum > IntEnumPtr
Definition IntEnum.h:36
std::shared_ptr< class List > ListPtr
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
static type::Descriptor GetDescriptor(DataInput &i, TypeInput &j)
typename TypedVisitorBase< data::VariantPtr, const type::VariantPtr >::TypeInput TypeInput
std::vector< std::pair< DataInputNonConst, TypeInputNonConst > > ListElements
typename TypedVisitorBase< data::VariantPtr, const type::VariantPtr >::DataInput DataInput
std::pair< std::pair< DataInputNonConst, TypeInputNonConst >, std::pair< DataInputNonConst, TypeInputNonConst > > PairElements
std::vector< std::pair< DataInputNonConst, TypeInputNonConst > > TupleElements
std::map< std::string, std::pair< DataInputNonConst, TypeInputNonConst > > MapElements
#define ARMARX_TRACE
Definition trace.h:77