Client.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <functional>
4 #include <vector>
5 
6 #include "Interaction.h"
7 #include "Layer.h"
8 
9 namespace armarx
10 {
11  class Component;
12  class ManagedIceObject;
13 
14  namespace viz
15  {
16  /**
17  * A staged commit prepares multiple layers to be committed.
18  *
19  * Add all relevant layer updates via .add(layer).
20  * Add layers for which you want interaction feedback via .requestInteraction(layer).
21  * Then, commit via client.apply(stagedCommit).
22  *
23  * A staged commit can be reused for subsequent commits.
24  * Remember to call .reset() to clear the internal data structures.
25  *
26  * As long as you keep the staged commits separate, this method is thread-safe.
27  * So you can have two threads calling .commit(A) and .commit(B)
28  * simultaneously without any locking mechanism.
29  */
30  struct StagedCommit
31  {
32  /**
33  * @brief Stage a layer to be committed later via client.apply(*this)
34  * @param layer The layer to be added to this staged commit.
35  */
36  void
37  add(Layer const& layer)
38  {
39  data_.updates.push_back(layer.data_);
40  }
41 
42  void
43  add(std::initializer_list<Layer> layers)
44  {
45  data_.updates.reserve(data_.updates.size() + layers.size());
46  for (Layer const& layer : layers)
47  {
48  data_.updates.push_back(layer.data_);
49  }
50  }
51 
52  /**
53  * @brief Request interaction feedback for a particular layer.
54  * @param layer The layer you want to get interaction feedback for.
55  */
56  void
57  requestInteraction(Layer const& layer)
58  {
59  data_.interactionComponent = layer.data_.component;
60  data_.interactionLayers.push_back(layer.data_.name);
61  }
62 
63  /**
64  * @brief Reset all staged layers and interaction requests.
65  */
66  void
68  {
69  data_.updates.clear();
70  data_.interactionComponent.clear();
71  data_.interactionLayers.clear();
72  }
73 
74  viz::data::CommitInput data_;
75  };
76 
77  struct CommitResult
78  {
79  long
80  revision() const
81  {
82  return data_.revision;
83  }
84 
86  interactions() const
87  {
88  const InteractionFeedback* begin =
89  reinterpret_cast<const InteractionFeedback*>(data_.interactions.data());
90  const InteractionFeedback* end = begin + data_.interactions.size();
91  return InteractionFeedbackRange{begin, end};
92  }
93 
94  data::CommitResult data_;
95  };
96 
98  {
99  bool
100  isAvailable() const
101  {
102  return async && async->isCompleted();
103  }
104 
106  waitAndGet() const
107  {
108  CommitResult result;
109  result.data_ = storage->end_commitAndReceiveInteractions(async);
110  return result;
111  }
112 
113  Ice::AsyncResultPtr async;
114  armarx::viz::StorageInterfacePrx storage;
115  };
116 
117  struct Client
118  {
119  Client() = default;
120  Client(const Client&) = default;
121 
123  std::string const& topicNameProperty = "ArVizTopicName",
124  std::string const& storageNameProperty = "ArVizStorageName");
125 
127  std::string const& topicName = "ArVizTopic",
128  std::string const& storageName = "ArVizStorage");
129 
130  static Client createFromTopic(std::string const& componentName,
131  armarx::viz::Topic::ProxyType const& topic);
132 
133  static Client
134  createFromProxies(std::string const& componentName,
136  armarx::viz::StorageAndTopicInterfacePrx const& storage);
137 
139  std::string const& topicName = "ArVizTopic",
140  std::string const& storageName = "ArVizStorage");
141 
142  Layer layer(std::string const& name) const;
143 
146  {
147  return StagedCommit();
148  }
149 
151 
153 
154  void
156  {
157  std::vector<Layer> layers;
158  layers.push_back(layer);
159  commit(layers);
160  }
161 
162  void commit(std::vector<Layer> const& layers);
163 
164  void
165  commitLayerContaining(std::string const& name)
166  {
167  std::vector<viz::Layer> layers;
168  layers.push_back(this->layer(name));
169  commit(layers);
170  }
171 
172  template <typename ElementT>
173  void
174  commitLayerContaining(std::string const& name, ElementT const& element)
175  {
176  std::vector<viz::Layer> layers;
177  viz::Layer& newLayer = layers.emplace_back(this->layer(name));
178  newLayer.add(element);
179  commit(layers);
180  }
181 
182  void
183  commitDeleteLayer(std::string const& name)
184  {
185  std::vector<viz::Layer> layers;
186  viz::Layer& layerToDelete = layers.emplace_back(this->layer(name));
187  layerToDelete.markForDeletion();
188  commit(layers);
189  }
190 
191  private:
192  std::string componentName;
193  armarx::viz::StorageInterfacePrx storage;
195  };
196 
197  } // namespace viz
198 } // namespace armarx
armarx::viz::Client::commit
CommitResult commit(StagedCommit const &commit)
Definition: Client.cpp:89
armarx::viz::StagedCommit::add
void add(Layer const &layer)
Stage a layer to be committed later via client.apply(*this)
Definition: Client.h:37
armarx::viz::Client::createFromProxies
static Client createFromProxies(std::string const &componentName, armarx::viz::Topic::ProxyType const &topic, armarx::viz::StorageAndTopicInterfacePrx const &storage)
Definition: Client.cpp:50
armarx::viz::Client::stage
StagedCommit stage()
Definition: Client.h:145
armarx::viz::Client::commitAsync
CommitResultAsync commitAsync(StagedCommit const &commit)
Definition: Client.cpp:99
armarx::viz::CommitResult::revision
long revision() const
Definition: Client.h:80
armarx::ProxyType::component
@ component
armarx::viz::Client::createFromTopic
static Client createFromTopic(std::string const &componentName, armarx::viz::Topic::ProxyType const &topic)
Definition: Client.cpp:40
armarx::viz::Client::commitDeleteLayer
void commitDeleteLayer(std::string const &name)
Definition: Client.h:183
armarx::viz::CommitResultAsync
Definition: Client.h:97
Layer.h
armarx::viz::CommitResultAsync::isAvailable
bool isAvailable() const
Definition: Client.h:100
armarx::viz::Layer::add
void add(ElementT const &element)
Definition: Layer.h:31
armarx::viz::StagedCommit
A staged commit prepares multiple layers to be committed.
Definition: Client.h:30
Interaction.h
armarx::viz::CommitResultAsync::waitAndGet
CommitResult waitAndGet() const
Definition: Client.h:106
armarx::viz::Client::commitLayerContaining
void commitLayerContaining(std::string const &name, ElementT const &element)
Definition: Client.h:174
armarx::viz::Client::Client
Client()=default
armarx::viz::StagedCommit::reset
void reset()
Reset all staged layers and interaction requests.
Definition: Client.h:67
armarx::viz::Client::createForGuiPlugin
static Client createForGuiPlugin(armarx::Component &component, std::string const &topicName="ArVizTopic", std::string const &storageName="ArVizStorage")
Definition: Client.cpp:62
IceStorm::TopicPrx
::IceInternal::ProxyHandle<::IceProxy::IceStorm::Topic > TopicPrx
Definition: IceManager.h:70
armarx::viz::Layer::data_
data::LayerUpdate data_
Definition: Layer.h:57
armarx::viz::CommitResult::interactions
InteractionFeedbackRange interactions() const
Definition: Client.h:86
armarx::viz::StagedCommit::requestInteraction
void requestInteraction(Layer const &layer)
Request interaction feedback for a particular layer.
Definition: Client.h:57
armarx::ProxyType::topic
@ topic
armarx::viz::CommitResultAsync::storage
armarx::viz::StorageInterfacePrx storage
Definition: Client.h:114
armarx::ProxyType
ProxyType
Definition: ProxyPropertyDefinition.h:40
armarx::viz::InteractionFeedbackRange
Definition: Interaction.h:147
armarx::viz::CommitResult
Definition: Client.h:77
armarx::viz::InteractionFeedback
Definition: Interaction.h:59
armarx::viz::Client::commit
void commit(Layer const &layer)
Definition: Client.h:155
armarx::Component
Baseclass for all ArmarX ManagedIceObjects requiring properties.
Definition: Component.h:91
armarx::ManagedIceObject
The ManagedIceObject is the base class for all ArmarX objects.
Definition: ManagedIceObject.h:162
armarx::viz::CommitResult::data_
data::CommitResult data_
Definition: Client.h:94
armarx::viz::StagedCommit::add
void add(std::initializer_list< Layer > layers)
Definition: Client.h:43
armarx::viz::StagedCommit::data_
viz::data::CommitInput data_
Definition: Client.h:74
armarx::viz::Client::layer
Layer layer(std::string const &name) const
Definition: Client.cpp:80
armarx::viz::Client
Definition: Client.h:117
armarx::viz::Layer
Definition: Layer.h:12
armarx::viz::Layer::markForDeletion
void markForDeletion()
Definition: Layer.h:46
armarx::viz
This file is part of ArmarX.
Definition: ArVizStorage.cpp:418
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::viz::Client::commitLayerContaining
void commitLayerContaining(std::string const &name)
Definition: Client.h:165
armarx::viz::CommitResultAsync::async
Ice::AsyncResultPtr async
Definition: Client.h:113