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
18namespace 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
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
148
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
189
190 int counter = 0;
191 };
192
194
196 {
198 std::string element;
199 viz::data::InteractionDescription interaction;
201 };
202
204 {
205 public:
207
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;
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
uint8_t index
std::vector< CoinLayerID > getLayerIDs()
void showLayer(CoinLayerID const &id, bool visible)
void onSelectEvent(SoPath *path, int eventType)
CoinVisualizer_UpdateTiming lastTiming
Definition Visualizer.h:294
void onUpdateFailure(Ice::Exception const &ex)
std::vector< std::function< void(CoinLayerID const &layerID, CoinLayer const &layer)> > layerUpdatedCallbacks
A layer's data has changed.
Definition Visualizer.h:291
CoinLayer & findOrAddLayer(CoinLayerID const &layerID)
SoSeparator * manipulatorGroup
Definition Visualizer.h:277
std::atomic< CoinVisualizerState > state
Definition Visualizer.h:284
CoinVisualizer_ApplyTiming apply(data::LayerUpdate const &update)
void emitLayersChanged(std::vector< CoinLayerID > const &layerIDs)
void startAsync(StorageInterfacePrx const &storage)
std::vector< std::unique_ptr< coin::ElementVisualizer > > elementVisualizers
Definition Visualizer.h:273
std::function< void(std::vector< CoinLayerID > const &)> layersChangedCallback
Definition Visualizer.h:287
std::vector< std::type_index > elementVisualizersTypes
Definition Visualizer.h:272
void selectElement(int index)
SoTransformerManip * manipulator
Definition Visualizer.h:278
IceUtil::Handle< CoinVisualizerWrapper > callbackData
Definition Visualizer.h:264
void exportToVRML(std::string const &exportFilePath)
ElementInteractionData * selectedElement
Definition Visualizer.h:260
std::atomic< CoinVisualizerUpdateResult > updateResult
Definition Visualizer.h:280
void addOrUpdateElements(CoinLayer *layer, data::LayerUpdate const &update)
void emitLayerUpdated(CoinLayerID const &layerID, CoinLayer const &layer)
viz::StorageInterfacePrx stateStorage
Definition Visualizer.h:285
void removeElementsIfNotUpdated(CoinLayer *layer)
data::LayerUpdates pulledUpdates
Definition Visualizer.h:281
void onUpdateSuccess(data::LayerUpdates const &updates)
viz::StorageInterfacePrx storage
Definition Visualizer.h:268
std::vector< std::unique_ptr< ElementInteractionData > > elementInteractions
Definition Visualizer.h:257
std::vector< viz::data::InteractionFeedback > interactionFeedbackBuffer
Definition Visualizer.h:258
armarx::viz::Callback_StorageInterface_pullUpdatesSinceAndSendInteractionsPtr callback
Definition Visualizer.h:265
void addOrUpdateInteraction(CoinLayerID const &layerID, std::string const &elementID, data::InteractionDescription const &interactionDesc, coin::ElementVisualization *visu)
void onManipulation(SoDragger *dragger, int eventType)
CoinVisualizer_UpdateTiming getTiming()
This file is part of ArmarX.
std::pair< std::string, std::string > CoinLayerID
Definition Visualizer.h:20
CoinVisualizerUpdateResult
Definition Visualizer.h:150
bool isElementIdLess(CoinLayerElement const &left, CoinLayerElement const &right)
Definition Visualizer.h:29
bool isCoinLayerIdLess(CoinLayer const &left, CoinLayer const &right)
Definition Visualizer.h:106
std::unique_ptr< coin::ElementVisualization > visu
Definition Visualizer.h:25
CoinLayer * findLayer(CoinLayerID const &id)
Definition Visualizer.h:121
CoinLayer const * findLayer(CoinLayerID const &id) const
Definition Visualizer.h:132
auto lowerBound(CoinLayerID const &id)
Definition Visualizer.h:114
std::vector< CoinLayer > data
Definition Visualizer.h:137
std::vector< CoinLayerElement > elements
Definition Visualizer.h:101
void operator=(CoinLayer const &)=delete
void operator=(CoinLayer &&other)
Definition Visualizer.h:67
CoinLayerElement const * findElement(std::string const &id) const
Definition Visualizer.h:94
auto lowerBound(std::string const &id)
Definition Visualizer.h:76
CoinLayer(CoinLayer &&other)
Definition Visualizer.h:46
CoinLayerElement * findElement(std::string const &id)
Definition Visualizer.h:83
CoinLayer(CoinLayerID const &id, SoSeparator *node)
Definition Visualizer.h:38
CoinLayer(CoinLayer const &)=delete
CoinLayerElement pivot
Definition Visualizer.h:102
void add(CoinVisualizer_ApplyTiming const &other)
Definition Visualizer.h:166
CoinVisualizer_ApplyTiming applyTotal
Definition Visualizer.h:179
std::vector< CoinVisualizer_ApplyTiming > applies
Definition Visualizer.h:177
coin::ElementVisualization * visu
Definition Visualizer.h:200
viz::data::InteractionDescription interaction
Definition Visualizer.h:199