Visualizer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <functional>
4 #include <memory>
5 #include <mutex>
6 #include <string>
7 #include <typeindex>
8 
9 #include <IceUtil/Shared.h>
10 
11 #include <RobotAPI/interface/ArViz/Component.h>
12 
13 #include "ElementVisualizer.h"
14 #include <Inventor/manips/SoTransformerManip.h>
15 #include <Inventor/nodes/SoSelection.h>
16 #include <Inventor/nodes/SoSeparator.h>
17 
18 namespace armarx::viz
19 {
20  using CoinLayerID = std::pair<std::string, std::string>;
21 
23  {
24  data::ElementPtr data;
25  std::unique_ptr<coin::ElementVisualization> visu;
26  };
27 
28  inline bool
30  {
31  return left.data->id < right.data->id;
32  }
33 
34  struct CoinLayer
35  {
36  CoinLayer() = default;
37 
38  CoinLayer(CoinLayerID const& id, SoSeparator* node) : id(id), node(node)
39  {
40  // Increase ref-count, so we can add/remove this node without it being deleted
41  // This is needed for showing/hiding layers
42  node->ref();
43  pivot.data = new data::Element;
44  }
45 
46  CoinLayer(CoinLayer&& other) :
47  id(std::move(other.id)),
48  node(other.node),
49  elements(std::move(other.elements)),
50  pivot(std::move(other.pivot))
51  {
52  other.node = nullptr;
53  }
54 
56  {
57  if (node)
58  {
59  node->unref();
60  }
61  }
62 
63  CoinLayer(CoinLayer const&) = delete;
64  void operator=(CoinLayer const&) = delete;
65 
66  void
68  {
69  id = std::move(other.id);
70  node = other.node;
71  other.node = nullptr;
72  elements = std::move(other.elements);
73  }
74 
75  auto
76  lowerBound(std::string const& id)
77  {
78  pivot.data->id = id;
79  return std::lower_bound(elements.begin(), elements.end(), pivot, &isElementIdLess);
80  }
81 
83  findElement(std::string const& id)
84  {
85  auto iter = lowerBound(id);
86  if (iter != elements.end() && iter->data->id == id)
87  {
88  return &*iter;
89  }
90  return nullptr;
91  }
92 
93  CoinLayerElement const*
94  findElement(std::string const& id) const
95  {
96  return const_cast<CoinLayer*>(this)->findElement(id);
97  }
98 
100  SoSeparator* node = nullptr;
101  std::vector<CoinLayerElement> elements;
103  };
104 
105  inline bool
106  isCoinLayerIdLess(CoinLayer const& left, CoinLayer const& right)
107  {
108  return left.id < right.id;
109  }
110 
112  {
113  auto
115  {
116  pivot.id = id;
117  return std::lower_bound(data.begin(), data.end(), pivot, &isCoinLayerIdLess);
118  }
119 
120  CoinLayer*
122  {
123  auto iter = lowerBound(id);
124  if (iter != data.end() && iter->id == id)
125  {
126  return &*iter;
127  }
128  return nullptr;
129  }
130 
131  CoinLayer const*
132  findLayer(CoinLayerID const& id) const
133  {
134  return const_cast<CoinLayerMap*>(this)->findLayer(id);
135  }
136 
137  std::vector<CoinLayer> data;
139  };
140 
142  {
143  STOPPED,
144  STARTING,
145  RUNNING,
146  STOPPING
147  };
148 
150  {
151  SUCCESS,
152  WAITING,
153  FAILURE,
154  };
155 
157  {
158  std::string layerName;
159 
160  IceUtil::Time addLayer = IceUtil::Time::seconds(0);
161  IceUtil::Time updateElements = IceUtil::Time::seconds(0);
162  IceUtil::Time removeElements = IceUtil::Time::seconds(0);
163  IceUtil::Time total = IceUtil::Time::seconds(0);
164 
165  void
167  {
168  addLayer += other.addLayer;
171  total += other.total;
172  }
173  };
174 
176  {
177  std::vector<CoinVisualizer_ApplyTiming> applies;
178 
180 
181  IceUtil::Time pull = IceUtil::Time::seconds(0);
182  IceUtil::Time layersChanged = IceUtil::Time::seconds(0);
183  IceUtil::Time total = IceUtil::Time::seconds(0);
184 
185  IceUtil::Time waitStart = IceUtil::Time::seconds(0);
186  IceUtil::Time waitDuration = IceUtil::Time::seconds(0);
187 
188  int updateToggle = 0;
189 
190  int counter = 0;
191  };
192 
193  struct CoinVisualizerWrapper;
194 
196  {
198  std::string element;
199  viz::data::InteractionDescription interaction;
201  };
202 
204  {
205  public:
206  CoinVisualizer();
207 
208  ~CoinVisualizer();
209 
210  void clearCache();
211 
213 
214  void startAsync(StorageInterfacePrx const& storage);
215 
216  void stop();
217 
218  CoinVisualizer_ApplyTiming apply(data::LayerUpdate const& update);
219 
220  void update();
221 
222  void exportToVRML(std::string const& exportFilePath);
223 
224  template <typename ElementVisuT>
225  void
227  {
228  using ElementT = typename ElementVisuT::ElementType;
229  using VisualizerT = coin::TypedElementVisualizer<ElementVisuT>;
230  // Map element type to visualizer
231  elementVisualizersTypes.emplace_back(typeid(ElementT));
232  elementVisualizers.push_back(std::make_unique<VisualizerT>());
233  }
234 
235  void showLayer(CoinLayerID const& id, bool visible);
236 
238 
239  CoinLayer& findOrAddLayer(CoinLayerID const& layerID);
240  void addOrUpdateElements(CoinLayer* layer, data::LayerUpdate const& update);
241  void addOrUpdateInteraction(CoinLayerID const& layerID,
242  std::string const& elementID,
243  data::InteractionDescription const& interactionDesc,
246 
247  std::vector<CoinLayerID> getLayerIDs();
248  void emitLayersChanged(std::vector<CoinLayerID> const& layerIDs);
249  void emitLayerUpdated(CoinLayerID const& layerID, CoinLayer const& layer);
250 
251  void selectElement(int index);
252  void onSelectEvent(SoPath* path, int eventType);
253  void onManipulation(SoDragger* dragger, int eventType);
254  // These are selectable element IDs and need to be persistent in memory.
255  // We store a raw pointer to these into the SoSeperator objects of Coin.
256  // Later, we can retrieve the element ID from this pointer, if it has been selected.
257  std::vector<std::unique_ptr<ElementInteractionData>> elementInteractions;
258  std::vector<viz::data::InteractionFeedback> interactionFeedbackBuffer;
259  // The currently selected element. Maybe nullptr if no element is selected.
261 
262  void onUpdateSuccess(data::LayerUpdates const& updates);
263  void onUpdateFailure(Ice::Exception const& ex);
265  armarx::viz::Callback_StorageInterface_pullUpdatesSinceAndSendInteractionsPtr callback;
266 
267  std::mutex storageMutex;
268  viz::StorageInterfacePrx storage;
269 
271 
272  std::vector<std::type_index> elementVisualizersTypes;
273  std::vector<std::unique_ptr<coin::ElementVisualizer>> elementVisualizers;
274 
275  SoSelection* selection = nullptr;
276  SoSeparator* root = nullptr;
277  SoSeparator* manipulatorGroup = nullptr;
278  SoTransformerManip* manipulator = nullptr;
279 
280  std::atomic<CoinVisualizerUpdateResult> updateResult{CoinVisualizerUpdateResult::SUCCESS};
281  data::LayerUpdates pulledUpdates;
282 
283  std::mutex stateMutex;
284  std::atomic<CoinVisualizerState> state{CoinVisualizerState::STOPPED};
285  viz::StorageInterfacePrx stateStorage;
286 
287  std::function<void(std::vector<CoinLayerID> const&)> layersChangedCallback;
288 
289  /// A layer's data has changed.
290  std::vector<std::function<void(CoinLayerID const& layerID, CoinLayer const& layer)>>
292 
293  std::mutex timingMutex;
295  };
296 } // namespace armarx::viz
armarx::viz::CoinVisualizer::selectedElement
ElementInteractionData * selectedElement
Definition: Visualizer.h:260
armarx::viz::CoinLayer
Definition: Visualizer.h:34
armarx::viz::CoinVisualizer_ApplyTiming::removeElements
IceUtil::Time removeElements
Definition: Visualizer.h:162
armarx::viz::CoinVisualizer::findOrAddLayer
CoinLayer & findOrAddLayer(CoinLayerID const &layerID)
Definition: Visualizer.cpp:211
armarx::viz::CoinVisualizer_UpdateTiming::waitDuration
IceUtil::Time waitDuration
Definition: Visualizer.h:186
armarx::viz::CoinLayerMap::findLayer
CoinLayer * findLayer(CoinLayerID const &id)
Definition: Visualizer.h:121
armarx::viz::CoinLayer::elements
std::vector< CoinLayerElement > elements
Definition: Visualizer.h:101
armarx::viz::CoinVisualizer::pulledUpdates
data::LayerUpdates pulledUpdates
Definition: Visualizer.h:281
armarx::viz::CoinVisualizer::state
std::atomic< CoinVisualizerState > state
Definition: Visualizer.h:284
armarx::viz::CoinVisualizer::selectElement
void selectElement(int index)
Definition: Visualizer.cpp:607
armarx::viz::CoinLayer::operator=
void operator=(CoinLayer const &)=delete
armarx::viz::coin::ElementVisualization
Definition: ElementVisualizer.h:21
armarx::viz::CoinVisualizer::elementVisualizers
std::vector< std::unique_ptr< coin::ElementVisualizer > > elementVisualizers
Definition: Visualizer.h:273
armarx::viz::CoinVisualizer_UpdateTiming::total
IceUtil::Time total
Definition: Visualizer.h:183
armarx::viz::CoinVisualizer::showLayer
void showLayer(CoinLayerID const &id, bool visible)
Definition: Visualizer.cpp:533
armarx::viz::CoinVisualizer::onSelectEvent
void onSelectEvent(SoPath *path, int eventType)
Definition: Visualizer.cpp:645
armarx::viz::ElementInteractionData::visu
coin::ElementVisualization * visu
Definition: Visualizer.h:200
ElementVisualizer.h
index
uint8_t index
Definition: EtherCATFrame.h:59
armarx::viz::CoinVisualizer::clearCache
void clearCache()
Definition: Visualizer.cpp:146
armarx::viz::CoinVisualizer::startAsync
void startAsync(StorageInterfacePrx const &storage)
Definition: Visualizer.cpp:153
armarx::viz::CoinVisualizer::stateStorage
viz::StorageInterfacePrx stateStorage
Definition: Visualizer.h:285
armarx::viz::CoinVisualizer::manipulator
SoTransformerManip * manipulator
Definition: Visualizer.h:278
armarx::viz::CoinVisualizer::selection
SoSelection * selection
Definition: Visualizer.h:275
armarx::viz::CoinLayerMap::pivot
CoinLayer pivot
Definition: Visualizer.h:138
armarx::viz::ElementInteractionData::layer
CoinLayerID layer
Definition: Visualizer.h:197
armarx::viz::CoinVisualizer::layerUpdatedCallbacks
std::vector< std::function< void(CoinLayerID const &layerID, CoinLayer const &layer)> > layerUpdatedCallbacks
A layer's data has changed.
Definition: Visualizer.h:291
armarx::viz::CoinVisualizer::getLayerIDs
std::vector< CoinLayerID > getLayerIDs()
Definition: Visualizer.cpp:574
armarx::viz::CoinVisualizer::onUpdateFailure
void onUpdateFailure(Ice::Exception const &ex)
Definition: Visualizer.cpp:526
armarx::viz::CoinVisualizerState::STOPPING
@ STOPPING
armarx::viz::CoinVisualizer::emitLayerUpdated
void emitLayerUpdated(CoinLayerID const &layerID, CoinLayer const &layer)
Definition: Visualizer.cpp:595
armarx::viz::CoinLayer::pivot
CoinLayerElement pivot
Definition: Visualizer.h:102
armarx::viz::CoinLayer::operator=
void operator=(CoinLayer &&other)
Definition: Visualizer.h:67
armarx::viz::CoinVisualizer::removeElementsIfNotUpdated
void removeElementsIfNotUpdated(CoinLayer *layer)
Definition: Visualizer.cpp:367
armarx::viz::CoinVisualizer::stateMutex
std::mutex stateMutex
Definition: Visualizer.h:283
armarx::viz::CoinVisualizer::onManipulation
void onManipulation(SoDragger *dragger, int eventType)
Definition: Visualizer.cpp:846
armarx::viz::CoinVisualizer_UpdateTiming::pull
IceUtil::Time pull
Definition: Visualizer.h:181
armarx::viz::CoinVisualizer::callback
armarx::viz::Callback_StorageInterface_pullUpdatesSinceAndSendInteractionsPtr callback
Definition: Visualizer.h:265
armarx::viz::CoinVisualizer_ApplyTiming::updateElements
IceUtil::Time updateElements
Definition: Visualizer.h:161
armarx::viz::CoinLayer::node
SoSeparator * node
Definition: Visualizer.h:100
armarx::viz::CoinVisualizerState::RUNNING
@ RUNNING
armarx::viz::CoinVisualizer_ApplyTiming::add
void add(CoinVisualizer_ApplyTiming const &other)
Definition: Visualizer.h:166
armarx::viz::CoinLayer::CoinLayer
CoinLayer(CoinLayer &&other)
Definition: Visualizer.h:46
armarx::viz::CoinVisualizerState::STARTING
@ STARTING
armarx::viz::CoinVisualizer_UpdateTiming::updateToggle
int updateToggle
Definition: Visualizer.h:188
armarx::viz::CoinVisualizer_UpdateTiming::counter
int counter
Definition: Visualizer.h:190
armarx::viz::CoinVisualizer_UpdateTiming
Definition: Visualizer.h:175
armarx::viz::CoinLayer::lowerBound
auto lowerBound(std::string const &id)
Definition: Visualizer.h:76
armarx::viz::CoinVisualizerUpdateResult::FAILURE
@ FAILURE
armarx::viz::ElementInteractionData::interaction
viz::data::InteractionDescription interaction
Definition: Visualizer.h:199
armarx::viz::ElementInteractionData
Definition: Visualizer.h:195
armarx::viz::CoinLayer::id
CoinLayerID id
Definition: Visualizer.h:99
armarx::viz::CoinVisualizer::callbackData
IceUtil::Handle< CoinVisualizerWrapper > callbackData
Definition: Visualizer.h:264
armarx::viz::CoinVisualizer::CoinVisualizer
CoinVisualizer()
Definition: Visualizer.cpp:114
armarx::viz::CoinVisualizerUpdateResult::WAITING
@ WAITING
armarx::viz::CoinLayerMap::data
std::vector< CoinLayer > data
Definition: Visualizer.h:137
armarx::viz::CoinVisualizer_UpdateTiming::waitStart
IceUtil::Time waitStart
Definition: Visualizer.h:185
armarx::viz::CoinVisualizer_UpdateTiming::layersChanged
IceUtil::Time layersChanged
Definition: Visualizer.h:182
armarx::viz::CoinVisualizer::registerVisualizationTypes
void registerVisualizationTypes()
Definition: RegisterVisualizationTypes.cpp:20
armarx::viz::CoinVisualizer::addOrUpdateInteraction
void addOrUpdateInteraction(CoinLayerID const &layerID, std::string const &elementID, data::InteractionDescription const &interactionDesc, coin::ElementVisualization *visu)
Definition: Visualizer.cpp:336
armarx::viz::CoinLayerMap::findLayer
CoinLayer const * findLayer(CoinLayerID const &id) const
Definition: Visualizer.h:132
armarx::viz::ElementInteractionData::element
std::string element
Definition: Visualizer.h:198
armarx::viz::CoinVisualizer::~CoinVisualizer
~CoinVisualizer()
Definition: Visualizer.cpp:141
armarx::viz::CoinVisualizer::emitLayersChanged
void emitLayersChanged(std::vector< CoinLayerID > const &layerIDs)
Definition: Visualizer.cpp:586
armarx::viz::CoinLayer::~CoinLayer
~CoinLayer()
Definition: Visualizer.h:55
armarx::viz::CoinVisualizer_ApplyTiming::total
IceUtil::Time total
Definition: Visualizer.h:163
armarx::viz::CoinVisualizer::layers
CoinLayerMap layers
Definition: Visualizer.h:270
armarx::viz::CoinLayerElement::data
data::ElementPtr data
Definition: Visualizer.h:24
armarx::viz::CoinLayerElement
Definition: Visualizer.h:22
armarx::viz::isElementIdLess
bool isElementIdLess(CoinLayerElement const &left, CoinLayerElement const &right)
Definition: Visualizer.h:29
armarx::viz::CoinVisualizer::stop
void stop()
Definition: Visualizer.cpp:168
armarx::viz::coin::TypedElementVisualizer
Definition: ElementVisualizer.h:71
armarx::viz::CoinVisualizer::exportToVRML
void exportToVRML(std::string const &exportFilePath)
Definition: Visualizer.cpp:977
armarx::viz::CoinVisualizer::addOrUpdateElements
void addOrUpdateElements(CoinLayer *layer, data::LayerUpdate const &update)
Definition: Visualizer.cpp:230
armarx::viz::CoinVisualizer::update
void update()
Definition: Visualizer.cpp:407
armarx::viz::CoinVisualizerState
CoinVisualizerState
Definition: Visualizer.h:141
armarx::viz::CoinVisualizer_ApplyTiming::layerName
std::string layerName
Definition: Visualizer.h:158
armarx::viz::CoinVisualizer_UpdateTiming::applyTotal
CoinVisualizer_ApplyTiming applyTotal
Definition: Visualizer.h:179
armarx::viz::CoinLayerElement::visu
std::unique_ptr< coin::ElementVisualization > visu
Definition: Visualizer.h:25
armarx::ElementTypes::ElementType
ElementType
Definition: AbstractObjectSerializer.h:32
armarx::viz::CoinVisualizer::root
SoSeparator * root
Definition: Visualizer.h:276
armarx::armem::Time
armarx::core::time::DateTime Time
Definition: forward_declarations.h:13
armarx::viz::CoinVisualizer::lastTiming
CoinVisualizer_UpdateTiming lastTiming
Definition: Visualizer.h:294
armarx::viz::CoinVisualizer
Definition: Visualizer.h:203
armarx::viz::CoinVisualizer::getTiming
CoinVisualizer_UpdateTiming getTiming()
Definition: Visualizer.cpp:567
armarx::viz::CoinVisualizerState::STOPPED
@ STOPPED
armarx::viz::CoinVisualizer::storage
viz::StorageInterfacePrx storage
Definition: Visualizer.h:268
armarx::viz::CoinVisualizer::apply
CoinVisualizer_ApplyTiming apply(data::LayerUpdate const &update)
Definition: Visualizer.cpp:179
armarx::viz::CoinVisualizer::onUpdateSuccess
void onUpdateSuccess(data::LayerUpdates const &updates)
Definition: Visualizer.cpp:519
armarx::viz::CoinVisualizer_UpdateTiming::applies
std::vector< CoinVisualizer_ApplyTiming > applies
Definition: Visualizer.h:177
armarx::viz::CoinVisualizer::timingMutex
std::mutex timingMutex
Definition: Visualizer.h:293
armarx::viz::CoinLayer::findElement
CoinLayerElement * findElement(std::string const &id)
Definition: Visualizer.h:83
armarx::viz::CoinVisualizer::storageMutex
std::mutex storageMutex
Definition: Visualizer.h:267
armarx::viz::CoinVisualizer_ApplyTiming
Definition: Visualizer.h:156
armarx::viz::CoinLayer::CoinLayer
CoinLayer()=default
armarx::viz::CoinVisualizerWrapper
Definition: Visualizer.cpp:27
armarx::viz::CoinVisualizer::elementInteractions
std::vector< std::unique_ptr< ElementInteractionData > > elementInteractions
Definition: Visualizer.h:257
std
Definition: Application.h:66
armarx::viz::isCoinLayerIdLess
bool isCoinLayerIdLess(CoinLayer const &left, CoinLayer const &right)
Definition: Visualizer.h:106
IceUtil::Handle
Definition: forward_declarations.h:30
armarx::viz::CoinVisualizer::updateResult
std::atomic< CoinVisualizerUpdateResult > updateResult
Definition: Visualizer.h:280
armarx::viz::CoinVisualizer::registerVisualizerFor
void registerVisualizerFor()
Definition: Visualizer.h:226
armarx::viz::CoinLayer::CoinLayer
CoinLayer(CoinLayerID const &id, SoSeparator *node)
Definition: Visualizer.h:38
armarx::viz::CoinLayer::findElement
CoinLayerElement const * findElement(std::string const &id) const
Definition: Visualizer.h:94
armarx::viz::CoinVisualizer::layersChangedCallback
std::function< void(std::vector< CoinLayerID > const &)> layersChangedCallback
Definition: Visualizer.h:287
armarx::viz::CoinVisualizerUpdateResult
CoinVisualizerUpdateResult
Definition: Visualizer.h:149
armarx::viz::CoinVisualizerUpdateResult::SUCCESS
@ SUCCESS
armarx::viz::CoinVisualizer::elementVisualizersTypes
std::vector< std::type_index > elementVisualizersTypes
Definition: Visualizer.h:272
armarx::viz::CoinLayerMap::lowerBound
auto lowerBound(CoinLayerID const &id)
Definition: Visualizer.h:114
armarx::viz::CoinLayerMap
Definition: Visualizer.h:111
armarx::viz
This file is part of ArmarX.
Definition: ArVizStorage.cpp:418
armarx::viz::CoinLayerID
std::pair< std::string, std::string > CoinLayerID
Definition: Visualizer.h:20
armarx::viz::CoinVisualizer_ApplyTiming::addLayer
IceUtil::Time addLayer
Definition: Visualizer.h:160
armarx::viz::CoinVisualizer::interactionFeedbackBuffer
std::vector< viz::data::InteractionFeedback > interactionFeedbackBuffer
Definition: Visualizer.h:258
armarx::viz::CoinVisualizer::manipulatorGroup
SoSeparator * manipulatorGroup
Definition: Visualizer.h:277