vizkit3d
Vizkit3DPlugin.hpp
Go to the documentation of this file.
1 #ifndef __VIZKIT3D_VIZPLUGIN_HPP__
2 #define __VIZKIT3D_VIZPLUGIN_HPP__
3 
4 #include <QtCore>
5 #include <QtGui>
6 
7 #include <osg/NodeCallback>
8 #include <osg/Group>
9 #include <osg/PositionAttitudeTransform>
10 
11 #include <boost/thread/mutex.hpp>
12 
13 namespace vizkit3d
14 {
19 class VizPluginRubyAdapterBase : public QObject
20 {
21  Q_OBJECT
22 
23  public slots:
24  virtual void update(QVariant&, bool) = 0;
25  virtual QString getDataType() = 0;
26  virtual QString getRubyMethod() = 0;
27 };
28 
32 class VizPluginRubyAdapterCollection : public QObject
33 {
34  Q_OBJECT
35 
36  public:
41  {
42  adapterList.push_back(adapter);
43  };
44 
49  {
50  std::vector<VizPluginRubyAdapterBase*>::iterator it = std::find(adapterList.begin(), adapterList.end(), adapter);
51  if (it != adapterList.end()) adapterList.erase(it);
52  };
53 
54  const std::vector<VizPluginRubyAdapterBase*> &getAdapterList() const
55  {
56  return adapterList;
57  }
58 
59  public slots:
65  {
66  QStringList* adapterStringList = new QStringList();
67  for(std::vector<VizPluginRubyAdapterBase*>::iterator it = adapterList.begin(); it != adapterList.end(); it++)
68  {
69  adapterStringList->push_back((*it)->getRubyMethod());
70  }
71  return adapterStringList;
72  };
73 
80  QObject* getAdapter(QString rubyMethodName)
81  {
82  for(std::vector<VizPluginRubyAdapterBase*>::iterator it = adapterList.begin(); it != adapterList.end(); it++)
83  {
84  if ((*it)->getRubyMethod() == rubyMethodName)
85  return *it;
86  }
87  return NULL;
88  };
89 
90  protected:
91  std::vector<VizPluginRubyAdapterBase*> adapterList;
92 };
93 class Vizkit3DWidget;
94 
110 class VizPluginBase : public QObject
111 {
112  friend class PickHandler;
113 
114  Q_OBJECT
115  Q_PROPERTY(QString vizkit3d_plugin_name READ getPluginName)
116  Q_PROPERTY(bool enabled READ isPluginEnabled WRITE setPluginEnabled)
117  Q_PROPERTY(bool KeepOldData READ isKeepOldDataEnabled WRITE setKeepOldData)
118  Q_PROPERTY(int MaxOldData READ getMaxOldData WRITE setMaxOldData)
119  Q_PROPERTY(QStringList frame READ getVisualizationFrames WRITE setVisualizationFrameFromList)
120  Q_PROPERTY(double scale READ getScale WRITE setScale)
121 
122  public:
123  VizPluginBase(QObject *parent=NULL);
124  virtual ~VizPluginBase();
125 
130  Vizkit3DWidget* getWidget() const;
131 
133  virtual bool isDirty() const;
135  void setDirty();
136 
139  osg::ref_ptr<osg::Group> getVizNode() const;
140  osg::ref_ptr<osg::Group> getRootNode() const;
141 
145  std::vector<QDockWidget*> getDockWidgets();
146 
147  public slots:
151  virtual bool isPluginEnabled();
152 
156  virtual void setPluginEnabled(bool enabled);
157 
159  virtual const QString getPluginName() const;
160  virtual void setPluginName(const QString &name);
161 
165  virtual void click(float x,float y);
166 
170  QObject* getRubyAdapterCollection();
171 
176  void setKeepOldData(bool value);
177  bool isKeepOldDataEnabled();
178 
182  virtual void clearVisualization();
183 
187  void deleteOldData();
188 
189  int getMaxOldData()const {return max_old_data;};
190  void setMaxOldData(int value);
191 
192  void setPose(const QVector3D &position, const QQuaternion &orientation);
193 
198  QStringList getVisualizationFrames() const;
199 
202  QString getVisualizationFrame() const;
203 
206  void setVisualizationFrameFromList(const QStringList &frames);
207 
210  void setVisualizationFrame(const QString &frame);
211 
215  double getScale() const;
216 
220  void setScale(double scale);
221 
222  signals:
226  void propertyChanged(QString property_name);
227 
231  void childrenChanged();
232 
236  void pluginActivityChanged(bool);
237 
242  void clicked(float x, float y);
243 
247  void picked(float x, float y,float z);
248 
249  protected:
253  virtual void updateMainNode(osg::Node* node) = 0;
254 
258  virtual osg::ref_ptr<osg::Node> createMainNode();
259 
263  virtual void createDockWidgets();
264 
268  virtual osg::ref_ptr<osg::Node> cloneCurrentViz();
269 
273  boost::mutex updateMutex;
274 
275  std::vector<QDockWidget*> dockWidgets;
276  QString vizkit3d_plugin_name;
278 
279  private:
280  class CallbackAdapter;
281  osg::ref_ptr<osg::NodeCallback> nodeCallback;
282  void updateCallback(osg::Node* node);
283 
284  osg::ref_ptr<osg::Node> mainNode; //node which is used by the child class
285  osg::ref_ptr<osg::Group> rootNode; //node which is the osg root node of the pluign
286  osg::ref_ptr<osg::PositionAttitudeTransform> vizNode; //node which describes the transformation between rootNode and mainNode
287  osg::ref_ptr<osg::Group> oldNodes; //node which is the root node for all old visualization graphs of the plugin
288 
289  //position of the vizNode
290  QVector3D position;
291 
292  //orientation of the viznode
293  QQuaternion orientation;
294 
295  bool isAttached;
296  bool dirty;
297  bool plugin_enabled;
298  bool keep_old_data;
299  unsigned int max_old_data;
300  QString current_frame;
301 };
302 
303 template <typename T> class Vizkit3DPlugin;
304 
322 template <typename T>
324 {
325  template <typename Type> friend class Vizkit3DPlugin;
326 
327  public:
328  virtual ~VizPluginAddType() {}
329 
330  protected:
335  virtual void updateDataIntern(const T &data) = 0;
336 };
337 
343 template <class T>
344 class Vizkit3DPlugin : public VizPluginBase,
345  public VizPluginAddType< T >
346 {
347  public:
348  Vizkit3DPlugin(QObject* parent = NULL)
349  : VizPluginBase(parent) {}
350 
351  virtual ~Vizkit3DPlugin() {}
352 
356  template<typename Type>
357  void updateData(const Type &data) {
358  boost::mutex::scoped_lock lockit(this->updateMutex);
359  this->setDirty();
360  VizPluginAddType<Type> *type = dynamic_cast<VizPluginAddType<Type>*>(this);
361  if(type)
362  type->updateDataIntern(data);
363  else
364  {
365  throw std::runtime_error("Wrong type given to visualizer");
366  }
367  };
368 };
369 
373 class VizkitPluginFactory : public QObject
374 {
375  Q_OBJECT
376 
377  public:
378  VizkitPluginFactory(QObject* parent = 0) : QObject(parent){};
379 
380  public slots:
381  virtual QObject* createPlugin(QString const& name) = 0;
382  virtual QStringList* getAvailablePlugins() const = 0;
383 };
384 
400 #define VizPluginRubyAdapterCommon(pluginName, dataType, methodName, rubyMethodName)\
401  class VizPluginRubyAdapter##pluginName##rubyMethodName : public VizPluginRubyAdapterBase {\
402  public:\
403  VizPluginRubyAdapter##pluginName##rubyMethodName(pluginName* plugin)\
404  {\
405  vizPlugin = plugin;\
406  };\
407  void update(QVariant& data, bool pass_ownership)\
408  {\
409  void* ptr = data.value<void*>();\
410  dataType* pluginData = reinterpret_cast<dataType*>(ptr);\
411  vizPlugin->methodName(*pluginData);\
412  if (pass_ownership) \
413  delete pluginData; \
414  }\
415  public slots:\
416  QString getDataType() \
417  {\
418  return #dataType;\
419  }\
420  QString getRubyMethod() \
421  {\
422  return #rubyMethodName; \
423  }\
424  private:\
425  pluginName* vizPlugin;\
426  };\
427  adapterCollection.addAdapter(new VizPluginRubyAdapter##pluginName##rubyMethodName(this));
428 
429 #define VizPluginRubyAdapter(pluginName, dataType, typeName) \
430  VizPluginRubyAdapterCommon(pluginName, dataType, updateData, update##typeName)
431 #define VizPluginRubyMethod(pluginName, dataType, methodName) \
432  VizPluginRubyAdapterCommon(pluginName, dataType, methodName, methodName)
433 #define VizPluginRubyConfig(pluginName, dataType, methodName) \
434  VizPluginRubyAdapterCommon(pluginName, dataType, methodName, methodName)
435 
436 
455 #define VizkitQtPlugin(pluginName)\
456  class QtPlugin##pluginName : public vizkit3d::VizkitPluginFactory {\
457  public:\
458  virtual QStringList* getAvailablePlugins() const\
459  {\
460  QStringList* result = new QStringList; \
461  result->push_back(#pluginName); \
462  return result;\
463  } \
464  virtual QObject* createPlugin(QString const& name)\
465  {\
466  if (name == #pluginName) \
467  return new pluginName;\
468  else return 0;\
469  };\
470  };\
471  Q_EXPORT_PLUGIN2(QtPlugin##pluginName, QtPlugin##pluginName)
472 
476 template <class T>
478 {
479  protected:
480  virtual void operatorIntern( osg::Node* node, osg::NodeVisitor* nv ) = 0;
481 
483  : groupNode(new osg::Group())
484  {
485  }
486 
487  osg::ref_ptr<osg::Node> createMainNode()
488  {
489  return groupNode;
490  }
491 
492  void updateMainNode( osg::Node* node )
493  {
494  // NULL for nodevisitor is ok here, since its not used anywhere
495  operatorIntern( node, NULL );
496  }
497 
498  void setMainNode( osg::Node* node )
499  {
500  groupNode->addChild( node );
501  }
502 
503  protected:
504  osg::ref_ptr<osg::Group> groupNode;
505  osg::ref_ptr<osg::Node> ownNode;
506 };
507 
508 }
509 #endif
const std::vector< VizPluginRubyAdapterBase * > & getAdapterList() const
Definition: Vizkit3DPlugin.hpp:54
VizPluginRubyAdapterCollection adapterCollection
Definition: Vizkit3DPlugin.hpp:277
Definition: PickHandler.hpp:29
Definition: Vizkit3DWidget.hpp:189
Definition: Vizkit3DPlugin.hpp:19
void addAdapter(VizPluginRubyAdapterBase *adapter)
Definition: Vizkit3DPlugin.hpp:40
VizkitPluginFactory(QObject *parent=0)
Definition: Vizkit3DPlugin.hpp:378
boost::mutex updateMutex
Definition: Vizkit3DPlugin.hpp:273
virtual ~Vizkit3DPlugin()
Definition: Vizkit3DPlugin.hpp:351
void removeAdapter(VizPluginRubyAdapterBase *adapter)
Definition: Vizkit3DPlugin.hpp:48
osg::ref_ptr< osg::Node > createMainNode()
Definition: Vizkit3DPlugin.hpp:487
void updateData(const Type &data)
Definition: Vizkit3DPlugin.hpp:357
void updateMainNode(osg::Node *node)
Definition: Vizkit3DPlugin.hpp:492
virtual QString getRubyMethod()=0
VizPluginAdapter()
Definition: Vizkit3DPlugin.hpp:482
virtual void update(QVariant &, bool)=0
Definition: Vizkit3DPlugin.hpp:477
std::vector< VizPluginRubyAdapterBase * > adapterList
Definition: Vizkit3DPlugin.hpp:88
Definition: Vizkit3DPlugin.hpp:373
Definition: Vizkit3DPlugin.hpp:323
Definition: Vizkit3DPlugin.hpp:32
QObject * getAdapter(QString rubyMethodName)
Definition: Vizkit3DPlugin.hpp:80
virtual ~VizPluginAddType()
Definition: Vizkit3DPlugin.hpp:328
Definition: Vizkit3DPlugin.hpp:303
Definition: AxesNode.cpp:12
virtual void updateDataIntern(const T &data)=0
QStringList * getListOfAvailableAdapter()
Definition: Vizkit3DPlugin.hpp:64
void setMainNode(osg::Node *node)
Definition: Vizkit3DPlugin.hpp:498
osg::ref_ptr< osg::Group > groupNode
Definition: Vizkit3DPlugin.hpp:504
Vizkit3DPlugin(QObject *parent=NULL)
Definition: Vizkit3DPlugin.hpp:348
osg::ref_ptr< osg::Node > ownNode
Definition: Vizkit3DPlugin.hpp:505
std::vector< QDockWidget * > dockWidgets
Definition: Vizkit3DPlugin.hpp:275
Definition: Vizkit3DPlugin.cpp:13
Definition: Vizkit3DPlugin.hpp:110