AronTreeWidgetConverter.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 RobotAPI::gui-plugins::SkillManagerMonitorWidgetController
17  * \author Raphael Grimm ( raphael dot grimm at kit dot edu )
18  * \date 2020
19  * \copyright http://www.gnu.org/licenses/gpl-2.0.txt
20  * GNU General Public License
21  */
22 
23 #include <string>
24 
25 // base class
27 
28 // armarx
29 #include <SimoxUtility/algorithm/string.h>
30 
32 
34 
35 // qt
36 #include <QTreeWidgetItem>
37 
38 #include "../widgets/EditMatrixWidget.h"
39 #include "../widgets/IntEnumWidget.h"
40 #include "../widgets/QuaternionWidget.h"
41 
42 namespace armarx::skills::gui
43 {
44  bool
46  {
47  return !isDirectError && !hasTransitiveError;
48  }
49 
50  bool
52  {
53  return hasTransitiveError;
54  }
55 
56  bool
58  {
59  return isDirectError;
60  }
61 
62  void
63  AronTreeWidgetConverterVisitor::handleErrors(AronTreeWidgetConverterVisitor childV,
64  bool ownFault)
65  {
67  isDirectError |= ownFault;
68  hasTransitiveError |= childV.isDirectError || childV.hasTransitiveError;
69 
70  auto* aronItem = AronTreeWidgetItem::DynamicCast(parentItem->child(index));
71  ARMARX_CHECK(aronItem);
72  aronItem->setValueErrorState(isDirectError, hasTransitiveError);
73  }
74 
75  void
76  AronTreeWidgetConverterVisitor::handleErrors(bool ownFault)
77  {
78 
80  isDirectError = ownFault;
81  auto* aronItem = AronTreeWidgetItem::DynamicCast(parentItem->child(index));
82  ARMARX_CHECK(aronItem);
83  aronItem->setValueErrorState(isDirectError, false);
84  }
85 
86  void
88  {
89 
91  auto createdAronDict = std::make_shared<aron::data::Dict>(i->getPath());
92  createdAron = createdAronDict;
93  QTreeWidgetItem* el = parentItem->child(index);
94 
95  if (i->getMaybe() != armarx::aron::type::Maybe::NONE)
96  {
97  // its a maybetype. We have to check the state
98  if (el->checkState(2) == Qt::CheckState::Unchecked)
99  {
100  createdAron = nullptr;
101  return;
102  }
103  }
104 
105  unsigned int x = 0;
106  for (const auto& [key, value] : i->getMemberTypes())
107  {
108  ARMARX_TRACE;
111 
112  handleErrors(v);
113  if (v.isConversionSuccessful())
114  {
115  createdAronDict->addElement(key, v.createdAron);
116  }
117  }
118  }
119 
120  void
122  {
123 
124  ARMARX_TRACE;
125  auto createdAronDict = std::make_shared<aron::data::Dict>(i->getPath());
126  createdAron = createdAronDict;
127  QTreeWidgetItem* el = parentItem->child(index);
128 
129  if (i->getMaybe() != armarx::aron::type::Maybe::NONE)
130  {
131  // its a maybetype. We have to check the state
132  if (el->checkState(2) == Qt::CheckState::Unchecked)
133  {
134  createdAron = nullptr;
135  return;
136  }
137  }
138 
139  for (int x = 0; x < el->childCount(); ++x)
140  {
141  auto it = el->child(x);
143  aron::type::visit(v, i->getAcceptedType());
144  auto key = it->text(0).toStdString();
145  // TODO: handle key errors more elegantly / separately, fine for now
146  handleErrors(v, createdAronDict->hasElement(key));
147  if (v.createdAron && v.isConversionSuccessful() && !createdAronDict->hasElement(key))
148  {
149  createdAronDict->addElement(key, v.createdAron);
150  }
151  }
152  }
153 
154  void
156  {
157 
158  ARMARX_TRACE;
159  auto createdAronList = std::make_shared<aron::data::List>(i->getPath());
160  createdAron = createdAronList;
161  auto* el = parentItem->child(index);
162 
163  if (i->getMaybe() != armarx::aron::type::Maybe::NONE)
164  {
165  // its a maybetype. We have to check the state
166  if (el->checkState(2) == Qt::CheckState::Unchecked)
167  {
168  createdAron = nullptr;
169  return;
170  }
171  }
172 
173  auto childrenTypes = i->getChildren();
174  ARMARX_CHECK(childrenTypes.size() == 1);
175  for (int j = 0; j < el->childCount(); ++j)
176  {
177  AronTreeWidgetConverterVisitor convVisitor(el, j);
178  aron::type::visit(convVisitor, childrenTypes[0]);
179  handleErrors(convVisitor);
180 
181  if (convVisitor.createdAron && convVisitor.isConversionSuccessful())
182  {
183  createdAronList->addElement(convVisitor.createdAron);
184  }
185  }
186  }
187 
188  void
190  {
191 
192  ARMARX_TRACE;
193  auto createdAronPair = std::make_shared<aron::data::List>(i->getPath());
194  createdAron = createdAronPair;
195  auto* el = parentItem->child(index);
196 
197  if (i->getMaybe() != armarx::aron::type::Maybe::NONE)
198  {
199  // its a maybetype. We have to check the state
200  if (el->checkState(2) == Qt::CheckState::Unchecked)
201  {
202  createdAron = nullptr;
203  return;
204  }
205  }
206 
207  for (int j = 0; j < 2; ++j)
208  {
209  AronTreeWidgetConverterVisitor convVisitor(el, j);
210  handleErrors(convVisitor);
211  if (convVisitor.createdAron && convVisitor.isConversionSuccessful())
212  {
213  createdAronPair->addElement(convVisitor.createdAron);
214  }
215  }
216  }
217 
218  void
220  {
221 
222  ARMARX_TRACE;
223  auto createdAronList = std::make_shared<aron::data::List>(i->getPath());
224  createdAron = createdAronList;
225  QTreeWidgetItem* el = parentItem->child(index);
226 
227  if (i->getMaybe() != armarx::aron::type::Maybe::NONE)
228  {
229  // its a maybetype. We have to check the state
230  if (el->checkState(2) == Qt::CheckState::Unchecked)
231  {
232  createdAron = nullptr;
233  return;
234  }
235  }
236 
237  for (int x = 0; x < el->childCount(); ++x)
238  {
239  auto* it = el->child(x);
241  aron::type::visit(v, i->getAcceptedType(x));
242  handleErrors(v);
243 
244  if (v.createdAron)
245  {
246  createdAronList->addElement(v.createdAron);
247  }
248  }
249  }
250 
251  void
253  {
254  ARMARX_TRACE;
255  ARMARX_ERROR << "Currently do not support supplying raw NDArrays!";
256  }
257 
258  void
260  {
261 
262  ARMARX_TRACE;
263  auto createdMatrix = std::make_shared<aron::data::NDArray>(i->getPath());
264  int dataSize = 0;
265  switch (i->getElementType())
266  {
267  case armarx::aron::type::matrix::UINT8:
268  case armarx::aron::type::matrix::INT8:
269  dataSize = 1;
270  break;
271  case armarx::aron::type::matrix::UINT16:
272  case armarx::aron::type::matrix::INT16:
273  dataSize = 2;
274  break;
275  case armarx::aron::type::matrix::UINT32:
276  case armarx::aron::type::matrix::INT32:
277  case armarx::aron::type::matrix::FLOAT32:
278  dataSize = 4;
279  break;
280  case armarx::aron::type::matrix::FLOAT64:
281  case armarx::aron::type::matrix::INT64:
282  dataSize = 8;
283  break;
284  };
285 
286 
287  // UGLY HACK: FIX ME!!!
288  switch (i->getElementType())
289  {
290  case armarx::aron::type::matrix::UINT8:
291  createdMatrix->setType("unsigned char");
292  break;
293  case armarx::aron::type::matrix::UINT16:
294  createdMatrix->setType("unsigned short");
295  break;
296  case armarx::aron::type::matrix::UINT32:
297  createdMatrix->setType("unsigned int");
298  break;
299  case armarx::aron::type::matrix::INT8:
300  createdMatrix->setType("char");
301  break;
302  case armarx::aron::type::matrix::INT16:
303  createdMatrix->setType("short");
304  break;
305  case armarx::aron::type::matrix::INT32:
306  createdMatrix->setType("int");
307  break;
308  case armarx::aron::type::matrix::FLOAT32:
309  createdMatrix->setType("float");
310  break;
311  case armarx::aron::type::matrix::FLOAT64:
312  createdMatrix->setType("double");
313  break;
314  case armarx::aron::type::matrix::INT64:
315  createdMatrix->setType("long");
316  break;
317  };
318 
319 
320  createdMatrix->setShape({i->getRows(), i->getCols(), dataSize});
321  int totalByteSize = i->getRows() * i->getCols() * dataSize;
322  createdAron = createdMatrix;
323  auto* el = parentItem->child(index);
324 
325  if (i->getMaybe() != armarx::aron::type::Maybe::NONE)
326  {
327  // its a maybetype. We have to check the state
328  if (el->checkState(2) == Qt::CheckState::Unchecked)
329  {
330  createdAron = nullptr;
331  return;
332  }
333  }
334 
335 
336  auto* rootWidget = el->treeWidget();
337  ARMARX_CHECK(rootWidget);
338  auto* widget = rootWidget->itemWidget(el, 1);
339  ARMARX_CHECK(rootWidget);
340  auto* matrixWidget = EditMatrixWidget::DynamicCastAndCheck(widget);
341  ARMARX_CHECK(matrixWidget);
342 
343  handleErrors(matrixWidget->hasParseErrors());
344  if (matrixWidget->hasParseErrors())
345  {
346  return;
347  }
348 
349 
350  // write to aron data
351  std::vector<unsigned char> elems;
352  elems.reserve(totalByteSize);
353  // CAUTION: Raw data has column based storage
354  for (size_t col = 0; col < (size_t)i->getCols(); ++col)
355  {
356  for (size_t row = 0; row < (size_t)i->getRows(); ++row)
357  {
358  // gets us directly the byte wise format
359  auto parsed = matrixWidget->parseElement(row, col);
360  // append vector to vector
361  elems.insert(elems.end(), parsed.begin(), parsed.end());
362  }
363  }
364  createdMatrix->setData(totalByteSize, elems.data());
365  }
366 
367  void
369  {
370 
371  ARMARX_TRACE;
372  auto createdQuat = std::make_shared<aron::data::NDArray>(i->getPath());
373  createdAron = createdQuat;
374  int dataSize = i->getElementType() == aron::type::quaternion::ElementType::FLOAT32 ? 4 : 8;
375  createdQuat->setShape({1, 4, dataSize});
376  createdQuat->setType(i->getFullName());
377  auto* el = parentItem->child(index);
378 
379  if (i->getMaybe() != armarx::aron::type::Maybe::NONE)
380  {
381  // its a maybetype. We have to check the state
382  if (el->checkState(2) == Qt::CheckState::Unchecked)
383  {
384  createdAron = nullptr;
385  return;
386  }
387  }
388 
389  auto* itemWidget = el->treeWidget()->itemWidget(el, 1);
390  auto* quatWidget = QuaternionWidget::DynamicCastAndCheck(itemWidget);
391 
392  // error handling
393  handleErrors(quatWidget->hasParseErrors());
394  if (quatWidget->hasParseErrors())
395  {
396  return;
397  }
398 
399  // write to aron data
400  auto serialized = quatWidget->parseAllToNDArray();
401  if ((int)serialized.size() != dataSize * 4)
402  {
404  << "serialized quaternions did not return byte sequence of correct length!";
405  }
406  createdQuat->setData(serialized.size(), serialized.data());
407  }
408 
409  void
411  {
412  ARMARX_TRACE;
413  // TODO
414  }
415 
416  void
418  {
419  ARMARX_TRACE;
420  // TODO
421  }
422 
423  void
425  {
426 
427  ARMARX_TRACE;
428  QTreeWidgetItem* el = parentItem->child(index);
429 
430  if (i->getMaybe() != armarx::aron::type::Maybe::NONE)
431  {
432  // its a maybetype. We have to check the state
433  if (el->checkState(2) == Qt::CheckState::Unchecked)
434  {
435  createdAron = nullptr;
436  return;
437  }
438  }
439 
440  auto* genericWidget = el->treeWidget()->itemWidget(el, 1);
441  auto* intEnumWidget = IntEnumWidget::DynamicCastAndCheck(genericWidget);
442  if (!intEnumWidget)
443  {
444  // already reporting error; continue here
445  return;
446  }
447  bool success;
448  std::tie(success, createdAron) = intEnumWidget->parseToAron();
449 
450  handleErrors(!success);
451  }
452 
453  void
455  {
456 
457  ARMARX_TRACE;
458  auto createdAronInt = std::make_shared<aron::data::Int>(i->getPath());
459  createdAron = createdAronInt;
460  QTreeWidgetItem* el = parentItem->child(index);
461 
462  if (i->getMaybe() != armarx::aron::type::Maybe::NONE)
463  {
464  // its a maybetype. We have to check the state
465  if (el->checkState(2) == Qt::CheckState::Unchecked)
466  {
467  createdAron = nullptr;
468  return;
469  }
470  }
471 
472  std::string str = el->text(1).toStdString();
473  if (str.empty())
474  {
475  createdAronInt->setValue(0);
476  return;
477  }
478  try
479  {
480  int val = simox::alg::to_<int>(str);
481  createdAronInt->setValue(val);
482  }
483  catch (const simox::error::SimoxError& err)
484  {
485  handleErrors();
486  ARMARX_VERBOSE << "Conversion from String to Int failed. Error:\"" << err.what()
487  << "\"";
488  return;
489  }
490  handleErrors(false);
491  }
492 
493  void
495  {
496 
497  ARMARX_TRACE;
498  auto createdAronLong = std::make_shared<aron::data::Long>(i->getPath());
499  createdAron = createdAronLong;
500  QTreeWidgetItem* el = parentItem->child(index);
501 
502  if (i->getMaybe() != armarx::aron::type::Maybe::NONE)
503  {
504  // its a maybetype. We have to check the state
505  if (el->checkState(2) == Qt::CheckState::Unchecked)
506  {
507  createdAron = nullptr;
508  return;
509  }
510  }
511 
512  std::string str = el->text(1).toStdString();
513  if (str.empty())
514  {
515  //TODO: similar behaviour for rest?
516  str = el->text(3).toStdString();
517  }
518  try
519  {
520  createdAronLong->setValue(simox::alg::to_<long>(str));
521  }
522  catch (const simox::error::SimoxError& err)
523  {
524  handleErrors();
525  ARMARX_VERBOSE << "Conversion from String to Long failed. Error:\"" << err.what()
526  << "\"";
527  return;
528  }
529  handleErrors(false);
530  }
531 
532  void
534  {
535 
536  ARMARX_TRACE;
537  auto createdAronFloat = std::make_shared<aron::data::Float>(i->getPath());
538  createdAron = createdAronFloat;
539  QTreeWidgetItem* el = parentItem->child(index);
540 
541  if (i->getMaybe() != armarx::aron::type::Maybe::NONE)
542  {
543  // its a maybetype. We have to check the state
544  if (el->checkState(2) == Qt::CheckState::Unchecked)
545  {
546  createdAron = nullptr;
547  return;
548  }
549  }
550 
551  std::string str = el->text(1).toStdString();
552  if (str.empty())
553  {
554  str = el->text(3).toStdString();
555  }
556  try
557  {
558  createdAronFloat->setValue(simox::alg::to_<float>(str));
559  }
560  catch (const simox::error::SimoxError& err)
561  {
562  handleErrors();
563  ARMARX_VERBOSE << "Conversion from String to Float failed. Error:\"" << err.what()
564  << "\"";
565  return;
566  }
567  handleErrors(false);
568  }
569 
570  void
572  {
573 
574  ARMARX_TRACE;
575  auto createdAronDouble = std::make_shared<aron::data::Double>(i->getPath());
576  createdAron = createdAronDouble;
577  QTreeWidgetItem* el = parentItem->child(index);
578 
579  if (i->getMaybe() != armarx::aron::type::Maybe::NONE)
580  {
581  // its a maybetype. We have to check the state
582  if (el->checkState(2) == Qt::CheckState::Unchecked)
583  {
584  createdAron = nullptr;
585  return;
586  }
587  }
588 
589  std::string str = el->text(1).toStdString();
590  if (str.empty())
591  {
592  str = el->text(3).toStdString();
593  }
594  try
595  {
596  createdAronDouble->setValue(simox::alg::to_<double>(str));
597  }
598  catch (const simox::error::SimoxError& err)
599  {
600  handleErrors();
601  ARMARX_VERBOSE << "Conversion from String to Double failed. Error:\"" << err.what()
602  << "\"";
603  return;
604  }
605  handleErrors(false);
606  }
607 
608  void
610  {
611 
612  ARMARX_TRACE;
613  auto createdAronBool = std::make_shared<aron::data::Bool>(i->getPath());
614  createdAron = createdAronBool;
615  QTreeWidgetItem* el = parentItem->child(index);
616 
617  if (i->getMaybe() != armarx::aron::type::Maybe::NONE)
618  {
619  // its a maybetype. We have to check the state
620  if (el->checkState(2) == Qt::CheckState::Unchecked)
621  {
622  createdAron = nullptr;
623  return;
624  }
625  }
626 
627  std::string str = el->text(1).toStdString();
628  if (str.empty())
629  {
630  str = el->text(3).toStdString();
631  }
632  try
633  {
634  createdAronBool->setValue(simox::alg::to_<bool>(str));
635  }
636  catch (const simox::error::SimoxError& err)
637  {
638  handleErrors();
639  ARMARX_VERBOSE << "Conversion from String to Bool failed. Error:\"" << err.what()
640  << "\"";
641  return;
642  }
643  handleErrors(false);
644  }
645 
646  void
648  {
649 
650  ARMARX_TRACE;
651  auto createdAronString = std::make_shared<aron::data::String>(i->getPath());
652  createdAron = createdAronString;
653  QTreeWidgetItem* el = parentItem->child(index);
654 
655  if (el == nullptr)
656  {
657  return;
658  }
659 
660  if (i->getMaybe() != armarx::aron::type::Maybe::NONE)
661  {
662  // its a maybetype. We have to check the state
663  if (el->checkState(2) == Qt::CheckState::Unchecked)
664  {
665  createdAron = nullptr;
666  return;
667  }
668  }
669 
670  std::string str = el->text(1).toStdString();
671  createdAronString->setValue(str);
672  }
673 
674  void
676  {
677  ARMARX_WARNING_S << "Received an unknown type when trying to convert a skill argument type "
678  "to an aron data object.";
679  }
680 } // namespace armarx::skills::gui
armarx::aron::type::VisitorBase< const type::VariantPtr >::Input
const type::VariantPtr Input
Definition: Visitor.h:91
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:187
armarx::aron::type::MatrixPtr
std::shared_ptr< class Matrix > MatrixPtr
Definition: forward_declarations.h:20
str
std::string str(const T &t)
Definition: UserAssistedSegmenterGuiWidgetController.cpp:43
armarx::skills::gui::AronTreeWidgetConverterVisitor::hasDirectError
bool hasDirectError() const
Definition: AronTreeWidgetConverter.cpp:57
armarx::aron::type::ImagePtr
std::shared_ptr< class Image > ImagePtr
Definition: forward_declarations.h:22
armarx::aron::type::NDArrayPtr
std::shared_ptr< class NDArray > NDArrayPtr
Definition: forward_declarations.h:19
armarx::skills::gui::AronTreeWidgetConverterVisitor
Definition: AronTreeWidgetConverter.h:34
armarx::skills::gui::EditMatrixWidget::DynamicCastAndCheck
static EditMatrixWidget * DynamicCastAndCheck(QWidget *)
Definition: EditMatrixWidget.cpp:92
armarx::skills::gui::AronTreeWidgetConverterVisitor::index
int index
Definition: AronTreeWidgetConverter.h:38
armarx::aron::type::TuplePtr
std::shared_ptr< class Tuple > TuplePtr
Definition: forward_declarations.h:17
armarx::aron::type::PointCloudPtr
std::shared_ptr< class PointCloud > PointCloudPtr
Definition: forward_declarations.h:23
armarx::aron::type::FloatPtr
std::shared_ptr< class Float > FloatPtr
Definition: forward_declarations.h:29
AronTreeWidgetConverter.h
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:82
armarx::skills::gui::AronTreeWidgetItem::DynamicCast
static AronTreeWidgetItem * DynamicCast(QTreeWidgetItem *)
Definition: AronTreeWidgetItem.cpp:15
armarx::aron::type::ListPtr
std::shared_ptr< class List > ListPtr
Definition: forward_declarations.h:14
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:77
armarx::aron::type::LongPtr
std::shared_ptr< class Long > LongPtr
Definition: forward_declarations.h:28
cxxopts::value
std::shared_ptr< Value > value()
Definition: cxxopts.hpp:855
armarx::skills::gui::AronTreeWidgetConverterVisitor::createdAron
aron::data::VariantPtr createdAron
Definition: AronTreeWidgetConverter.h:39
armarx::aron::type::StringPtr
std::shared_ptr< class String > StringPtr
Definition: forward_declarations.h:31
armarx::skills::gui::AronTreeWidgetConverterVisitor::parentItem
QTreeWidgetItem * parentItem
Definition: AronTreeWidgetConverter.h:37
armarx::skills::gui::AronTreeWidgetConverterVisitor::isConversionSuccessful
bool isConversionSuccessful()
Definition: AronTreeWidgetConverter.cpp:45
armarx::skills::gui::IntEnumWidget::DynamicCastAndCheck
static IntEnumWidget * DynamicCastAndCheck(QWidget *)
Definition: IntEnumWidget.cpp:45
All.h
armarx::aron::type::PairPtr
std::shared_ptr< class Pair > PairPtr
Definition: forward_declarations.h:16
armarx::aron::type::DictPtr
std::shared_ptr< class Dict > DictPtr
Definition: forward_declarations.h:13
armarx::skills::gui
Definition: PeriodicUpdateWidget.cpp:11
armarx::skills::gui::AronTreeWidgetConverterVisitor::visitAronVariant
void visitAronVariant(const aron::type::ObjectPtr &) final
Definition: AronTreeWidgetConverter.cpp:87
ARMARX_ERROR
#define ARMARX_ERROR
Definition: Logging.h:196
armarx::aron::type::BoolPtr
std::shared_ptr< class Bool > BoolPtr
Definition: forward_declarations.h:32
ARMARX_WARNING_S
#define ARMARX_WARNING_S
Definition: Logging.h:213
armarx::skills::gui::AronTreeWidgetConverterVisitor::visitUnknown
void visitUnknown(Input &) final
Definition: AronTreeWidgetConverter.cpp:675
armarx::skills::gui::QuaternionWidget::DynamicCastAndCheck
static QuaternionWidget * DynamicCastAndCheck(QWidget *)
Definition: QuaternionWidget.cpp:22
armarx::ctrlutil::v
double v(double t, double v0, double a0, double j)
Definition: CtrlUtil.h:39
armarx::aron::similarity::FloatSimilarity::NONE
@ NONE
Definition: FloatSimilarity.h:14
armarx::skills::gui::AronTreeWidgetConverterVisitor::onlyChildFailedConversion
bool onlyChildFailedConversion()
Definition: AronTreeWidgetConverter.cpp:51
armarx::aron::type::visit
void visit(VisitorImplementation &v, typename VisitorImplementation::Input &t)
The visit function.
Definition: Visitor.h:39
armarx::aron::type::IntEnumPtr
std::shared_ptr< IntEnum > IntEnumPtr
Definition: IntEnum.h:36
armarx::aron::type::ObjectPtr
std::shared_ptr< Object > ObjectPtr
Definition: Object.h:36
Logging.h
armarx::aron::type::QuaternionPtr
std::shared_ptr< class Quaternion > QuaternionPtr
Definition: forward_declarations.h:21
armarx::aron::type::IntPtr
std::shared_ptr< class Int > IntPtr
Definition: forward_declarations.h:27
armarx::aron::type::DoublePtr
std::shared_ptr< class Double > DoublePtr
Definition: forward_declarations.h:30
armarx::status::success
@ success