GraphVisualizerGuiPlugin.h
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  *
19  * @package ArmarX::RobotAPI
20  * @author Raphael Grimm <raphael dot grimm at kit dot edu>
21  * @date 2014
22  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
23  * GNU General Public License
24  */
25 
26 #pragma once
27 
28 // ArmarX
32 
33 #include <RobotAPI/interface/visualization/DebugDrawerInterface.h>
35 
37 #include <MemoryX/interface/gui/GraphVisualizerInterface.h>
38 
39 //qt
40 #include <QMainWindow>
41 #include <QDialog>
42 #include <QGraphicsScene>
43 #include <QGraphicsLineItem>
44 #include <QGraphicsEllipseItem>
45 #include <QMouseEvent>
46 #include <MemoryX/interface/components/GraphNodePoseResolverInterface.h>
47 //std
48 #include <string>
49 #include <map>
50 #include <vector>
51 #include <tuple>
52 
53 //boost
54 
55 
56 
57 #include <MemoryX/gui-plugins/GraphVisualizerPlugin/ui_GraphVisualizerGuiPlugin.h>
59 
60 namespace memoryx
61 {
62  class GraphVisualizerGraphicsEllipseItem;
63  class GraphVisualizerGraphicsLineItem;
64 
65  class GraphVisualizerConfigDialog;
66  class GraphVisualizerWidget;
67 
68  class MouseEventProcessor;
69 
77  {
78  Q_OBJECT
79  Q_INTERFACES(ArmarXGuiInterface)
80  Q_PLUGIN_METADATA(IID "ArmarXGuiInterface/1.00")
81  public:
83  QString getPluginName() override
84  {
85  return "GraphVisualizerGuiPlugin";
86  }
87  };
88 
89 
215  public armarx::ArmarXComponentWidgetControllerTemplate<GraphVisualizerWidget>,
216  public GraphVisualizerInterface
217  {
218  Q_OBJECT
219  friend class MouseEventProcessor;
220  public:
221 
225  using NodeId = const std::string;
226 
230  using EdgeId = const std::pair<const std::string, const std::string>;
231 
232 
234  ~GraphVisualizerWidget() override;
235 
236  // inherited from Component
237  void onInitComponent() override;
238  void onConnectComponent() override;
239  void onExitComponent() override;
240 
241  // inherited of ArmarXWidget
242  static QString GetWidgetName()
243  {
244  return "MemoryX.GraphVisualizerGUI";
245  }
246  static QIcon GetWidgetIcon()
247  {
248  return QIcon {"://icons/graph_visu.svg"};
249  }
250 
251  QPointer<QDialog> getConfigDialog(QWidget* parent = 0) override;
252  void loadSettings(QSettings* settings) override;
253  void saveSettings(QSettings* settings) override;
254 
255  //because the above load/save functions are *obviously* for "Save/Load Gui Config." :/
256  virtual void loadAutomaticSettings();
257  virtual void saveAutomaticSettings();
258 
259  void configured() override;
260 
261  // slice interface implementation
262  bool hasEdge(const std::string& node1, const std::string& node2, const Ice::Current& = Ice::emptyCurrent) override
263  {
264  return (edges.find(toEdge(node1, node2)) != edges.end());
265  }
266 
267  bool hasNode(const std::string& id, const Ice::Current& = Ice::emptyCurrent) override
268  {
269  return (nodes.find(id) != nodes.end());
270  }
271 
272  public slots:
273  // slice interface implementation
274  void addEdge(const std::string& node1Id, const std::string& node2Id, const Ice::Current& = Ice::emptyCurrent) override;
275  void addNode(const GraphNodeBasePtr& node, const Ice::Current& = Ice::emptyCurrent) override;
276 
277  void highlightEdge(const std::string& node1Id, const std::string& node2Id, bool highlighted = true, const Ice::Current& = Ice::emptyCurrent) override;
278  void highlightNode(const std::string& nodeId, bool highlighted = true, const Ice::Current& = Ice::emptyCurrent) override;
279 
280  void clearEdges(const Ice::Current& = Ice::emptyCurrent) override;
281  void clearGraph(const Ice::Current& = Ice::emptyCurrent) override;
282 
283  void resetHighlight(const Ice::Current& = Ice::emptyCurrent) override;
284 
285  void redraw(const Ice::Current& = Ice::emptyCurrent) override;
286  void refreshGraph();
287 
288  void tableWidgetNodesCustomContextMenu(QPoint pos);
289  void tableWidgetEdgesCustomContextMenu(QPoint pos);
290 
291  protected:
295  Ui::GraphVisualizerGuiPlugin ui;
296 
297  private slots:
301  void addKitchenGraph();
302 
303  void selectedSceneChanged(int i);
304  void updateSceneList();
305 
306  void drawScene();
307 
312  void nodeTableDoubleClicked(int row, int);
317  void edgeTableDoubleClicked(int row, int);
318 
323  void nodeDoubleClicked(NodeId id);
324 
329  void edgeDoubleClicked(EdgeId id);
330 
336  void viewRotatedClock();
337 
343  void viewRotatedCounterClock();
344 
348  void transformView();
349 
353  void adjustView();
354 
355  bool addNewEdge(const std::string& from, const std::string& to);
356  void addNewEdgeBoth();
357  void addNewEdgeStartEnd();
358  void addNewEdgeEndStart();
359 
360  void addNewGraphNode();
361  void editGraphNode();
362 
363  private:
368  struct NodeData
369  {
373  GraphNodeBasePtr node;
374 
379 
383  QGraphicsEllipseItem* graphicsItem;
384 
388  int tableWidgetNodesIndex;
389 
393  bool highlighted;
394  };
395 
400  struct EdgeData
401  {
405  QGraphicsLineItem* graphicsItem;
409  int tableWidgetEdgesIndex;
410 
414  bool highlighted;
415  };
416 
417 
424  static EdgeId toEdge(const std::string& node1, const std::string& node2)
425  {
426  return EdgeId {node1, node2};
427  }
428 
433  void updateEdge(const EdgeId& id);
434 
439  void updateNode(const NodeId& id);
440 
441  void setEditFields(const NodeData& node);
442 
446  std::string debugDrawerTopicName;
447 
452 
456  QPointer<GraphVisualizerConfigDialog> dialog;
457 
458  float getYawAngle(const armarx::PoseBasePtr& pose) const;
459 
467  QPointer<QGraphicsScene> scene;
468 
472  std::map<std::string, NodeData> nodes;
473 
477  std::map<EdgeId, EdgeData> edges;
478 
482  qreal viewAngle;
483 
487  std::string debugDrawerLayerName;
488 
489  bool editStartNodeNext;
490 
491  std::string priorKnowledgeProxyName;
492  memoryx::PriorKnowledgeInterfacePrx priorKnowledgePrx;
493  memoryx::GraphNodePoseResolverInterfacePrx gnpr;
494  memoryx::GraphMemorySegmentBasePrx graphSeg;
495  QSettings settings;
496  QString lastSelectedSceneName;
497 
501  void selectScene();
502 
507  void loadScene(const std::string& xmlFile);
508 
509 
512  };
516  using GraphVisualizerGuiPluginPtr = std::shared_ptr<GraphVisualizerWidget>;
517 
518 
522  class GraphVisualizerGraphicsEllipseItem: public QGraphicsEllipseItem
523  {
524  public:
526 
527  GraphVisualizerGraphicsEllipseItem(GraphVisualizerWidget& visuWidget, NodeId name, qreal x, qreal y, qreal width, qreal height, QGraphicsItem* parent = nullptr):
528  QGraphicsEllipseItem {x, y, width, height, parent},
529  id {name},
530  parentVisuWidget(visuWidget)
531  {
532  }
533 
535  {
536  }
537  protected:
538  void mouseDoubleClickEvent(QGraphicsSceneMouseEvent*) override
539  {
540  parentVisuWidget.nodeDoubleClicked(id);
541  }
542  private:
546  const NodeId id;
547 
551  GraphVisualizerWidget& parentVisuWidget;
552  };
553 
557  class GraphVisualizerGraphicsLineItem: public QGraphicsLineItem
558  {
559  public:
561 
562  GraphVisualizerGraphicsLineItem(GraphVisualizerWidget& visuWidget, EdgeId name, qreal x1, qreal y1, qreal x2, qreal y2, QGraphicsItem* parent = 0):
563  QGraphicsLineItem {x1, y1, x2, y2, parent},
564  id {name},
565  parentVisuWidget(visuWidget)
566  {
567  }
568 
570  {
571  }
572  signals:
573  protected:
574  void mouseDoubleClickEvent(QGraphicsSceneMouseEvent*) override
575  {
576  parentVisuWidget.edgeDoubleClicked(id);
577  }
578  private:
582  const EdgeId id;
583 
587  GraphVisualizerWidget& parentVisuWidget;
588  };
589 
590  class MouseEventProcessor : public QObject
591  {
592  Q_OBJECT
593  public:
595  protected:
597  bool eventFilter(QObject* obj, QEvent* event) override;
598  };
599 }
600 
memoryx::GraphVisualizerWidget::onInitComponent
void onInitComponent() override
Pure virtual hook for the subclass.
Definition: GraphVisualizerGuiPlugin.cpp:168
memoryx::GraphVisualizerWidget::GetWidgetName
static QString GetWidgetName()
Definition: GraphVisualizerGuiPlugin.h:242
memoryx::GraphVisualizerWidget::ui
Ui::GraphVisualizerGuiPlugin ui
Contains the ui.
Definition: GraphVisualizerGuiPlugin.h:295
memoryx::GraphVisualizerGuiPlugin::getPluginName
QString getPluginName() override
Definition: GraphVisualizerGuiPlugin.h:83
memoryx::GraphVisualizerGraphicsLineItem::GraphVisualizerGraphicsLineItem
GraphVisualizerGraphicsLineItem(GraphVisualizerWidget &visuWidget, EdgeId name, qreal x1, qreal y1, qreal x2, qreal y2, QGraphicsItem *parent=0)
Definition: GraphVisualizerGuiPlugin.h:562
memoryx::GraphVisualizerGraphicsEllipseItem
Required to override the double click event.
Definition: GraphVisualizerGuiPlugin.h:522
memoryx::GraphVisualizerGuiPlugin
This plugin provides a widget used to visualize an undirected graph and draw it to a debug layer.
Definition: GraphVisualizerGuiPlugin.h:75
memoryx::GraphVisualizerWidget::getConfigDialog
QPointer< QDialog > getConfigDialog(QWidget *parent=0) override
getConfigDialog returns a pointer to the a configuration widget of this controller.
Definition: GraphVisualizerGuiPlugin.cpp:246
memoryx::GraphVisualizerGraphicsLineItem
Required to override the double click event.
Definition: GraphVisualizerGuiPlugin.h:557
armarx::ArmarXGuiPlugin
Definition: ArmarXGuiPlugin.h:46
memoryx::MouseEventProcessor
Definition: GraphVisualizerGuiPlugin.h:590
memoryx::GraphVisualizerGraphicsEllipseItem::GraphVisualizerGraphicsEllipseItem
GraphVisualizerGraphicsEllipseItem(GraphVisualizerWidget &visuWidget, NodeId name, qreal x, qreal y, qreal width, qreal height, QGraphicsItem *parent=nullptr)
Definition: GraphVisualizerGuiPlugin.h:527
memoryx::GraphVisualizerWidget::resetHighlight
void resetHighlight(const Ice::Current &=Ice::emptyCurrent) override
Definition: GraphVisualizerGuiPlugin.cpp:457
memoryx::GraphVisualizerWidget::saveSettings
void saveSettings(QSettings *settings) override
Implement to save the settings as part of the GUI configuration.
Definition: GraphVisualizerGuiPlugin.cpp:273
memoryx
VirtualRobot headers.
Definition: CommonPlacesTester.cpp:48
memoryx::GraphVisualizerGraphicsEllipseItem::mouseDoubleClickEvent
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *) override
Definition: GraphVisualizerGuiPlugin.h:538
armarx::ArmarXComponentWidgetControllerTemplate
Definition: ArmarXComponentWidgetController.h:69
memoryx::GraphVisualizerWidget::GraphVisualizerWidget
GraphVisualizerWidget()
Definition: GraphVisualizerGuiPlugin.cpp:141
memoryx::GraphVisualizerGraphicsLineItem::~GraphVisualizerGraphicsLineItem
~GraphVisualizerGraphicsLineItem() override
Definition: GraphVisualizerGuiPlugin.h:569
memoryx::GraphVisualizerWidget::addNode
void addNode(const GraphNodeBasePtr &node, const Ice::Current &=Ice::emptyCurrent) override
Definition: GraphVisualizerGuiPlugin.cpp:342
memoryx::GraphVisualizerWidget::NodeId
const std::string NodeId
The type of node ids.
Definition: GraphVisualizerGuiPlugin.h:225
ArmarXGuiInterface
The main gui interface.
Definition: ArmarXGuiInterface.h:74
IceInternal::Handle< FramedPose >
ArmarXGuiPlugin.h
PriorKnowledge.h
GraphVisualizerConfigDialog.h
ArmarXComponentWidgetController.h
memoryx::GraphVisualizerWidget::highlightEdge
void highlightEdge(const std::string &node1Id, const std::string &node2Id, bool highlighted=true, const Ice::Current &=Ice::emptyCurrent) override
Definition: GraphVisualizerGuiPlugin.cpp:618
memoryx::GraphVisualizerWidget
The GraphVisualizerWidget class.
Definition: GraphVisualizerGuiPlugin.h:214
FramedPose.h
memoryx::GraphVisualizerWidget::loadSettings
void loadSettings(QSettings *settings) override
Implement to load the settings that are part of the GUI configuration.
Definition: GraphVisualizerGuiPlugin.cpp:267
memoryx::GraphVisualizerWidget::hasNode
bool hasNode(const std::string &id, const Ice::Current &=Ice::emptyCurrent) override
Definition: GraphVisualizerGuiPlugin.h:267
memoryx::GraphVisualizerWidget::configured
void configured() override
This function must be implemented by the user, if he supplies a config dialog.
Definition: GraphVisualizerGuiPlugin.cpp:259
memoryx::GraphVisualizerWidget::clearGraph
void clearGraph(const Ice::Current &=Ice::emptyCurrent) override
Definition: GraphVisualizerGuiPlugin.cpp:429
memoryx::GraphVisualizerWidget::highlightNode
void highlightNode(const std::string &nodeId, bool highlighted=true, const Ice::Current &=Ice::emptyCurrent) override
Definition: GraphVisualizerGuiPlugin.cpp:635
memoryx::GraphVisualizerWidget::redraw
void redraw(const Ice::Current &=Ice::emptyCurrent) override
Definition: GraphVisualizerGuiPlugin.cpp:689
memoryx::GraphVisualizerGraphicsLineItem::mouseDoubleClickEvent
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *) override
Definition: GraphVisualizerGuiPlugin.h:574
memoryx::GraphVisualizerWidget::saveAutomaticSettings
virtual void saveAutomaticSettings()
Definition: GraphVisualizerGuiPlugin.cpp:284
Component.h
memoryx::GraphVisualizerGraphicsLineItem::EdgeId
GraphVisualizerWidget::EdgeId EdgeId
Definition: GraphVisualizerGuiPlugin.h:560
memoryx::GraphVisualizerWidget::hasEdge
bool hasEdge(const std::string &node1, const std::string &node2, const Ice::Current &=Ice::emptyCurrent) override
Definition: GraphVisualizerGuiPlugin.h:262
memoryx::GraphVisualizerGraphicsEllipseItem::NodeId
GraphVisualizerWidget::NodeId NodeId
Definition: GraphVisualizerGuiPlugin.h:525
memoryx::GraphVisualizerWidget::loadAutomaticSettings
virtual void loadAutomaticSettings()
Definition: GraphVisualizerGuiPlugin.cpp:279
memoryx::GraphVisualizerWidget::refreshGraph
void refreshGraph()
Definition: GraphVisualizerGuiPlugin.cpp:713
memoryx::GraphVisualizerGuiPluginPtr
std::shared_ptr< GraphVisualizerWidget > GraphVisualizerGuiPluginPtr
Boost shared pointer to a GraphVisualizerWidget.
Definition: GraphVisualizerGuiPlugin.h:516
memoryx::GraphVisualizerGraphicsEllipseItem::~GraphVisualizerGraphicsEllipseItem
~GraphVisualizerGraphicsEllipseItem() override
Definition: GraphVisualizerGuiPlugin.h:534
memoryx::MouseEventProcessor::MouseEventProcessor
MouseEventProcessor(GraphVisualizerWidget *gvw)
Definition: GraphVisualizerGuiPlugin.h:594
memoryx::GraphVisualizerWidget::onExitComponent
void onExitComponent() override
Hook for subclass.
Definition: GraphVisualizerGuiPlugin.cpp:242
memoryx::GraphVisualizerWidget::tableWidgetEdgesCustomContextMenu
void tableWidgetEdgesCustomContextMenu(QPoint pos)
Definition: GraphVisualizerGuiPlugin.cpp:1080
memoryx::GraphVisualizerGuiPlugin::GraphVisualizerGuiPlugin
GraphVisualizerGuiPlugin()
Definition: GraphVisualizerGuiPlugin.cpp:134
memoryx::MouseEventProcessor::gvw
GraphVisualizerWidget * gvw
Definition: GraphVisualizerGuiPlugin.h:596
memoryx::GraphVisualizerWidget::tableWidgetNodesCustomContextMenu
void tableWidgetNodesCustomContextMenu(QPoint pos)
Definition: GraphVisualizerGuiPlugin.cpp:1062
memoryx::GraphVisualizerWidget::~GraphVisualizerWidget
~GraphVisualizerWidget() override
Definition: GraphVisualizerGuiPlugin.cpp:163
memoryx::MouseEventProcessor::eventFilter
bool eventFilter(QObject *obj, QEvent *event) override
Definition: GraphVisualizerGuiPlugin.cpp:1098
memoryx::GraphVisualizerWidget::onConnectComponent
void onConnectComponent() override
Pure virtual hook for the subclass.
Definition: GraphVisualizerGuiPlugin.cpp:177
armarx::DebugDrawerInterfacePrx
::IceInternal::ProxyHandle< ::IceProxy::armarx::DebugDrawerInterface > DebugDrawerInterfacePrx
Definition: JointController.h:40
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:28
memoryx::GraphVisualizerWidget::GetWidgetIcon
static QIcon GetWidgetIcon()
Definition: GraphVisualizerGuiPlugin.h:246
memoryx::GraphVisualizerWidget::clearEdges
void clearEdges(const Ice::Current &=Ice::emptyCurrent) override
Definition: GraphVisualizerGuiPlugin.cpp:411
memoryx::GraphVisualizerWidget::addEdge
void addEdge(const std::string &node1Id, const std::string &node2Id, const Ice::Current &=Ice::emptyCurrent) override
Definition: GraphVisualizerGuiPlugin.cpp:289
memoryx::GraphVisualizerWidget::EdgeId
const std::pair< const std::string, const std::string > EdgeId
The type of edge ids.
Definition: GraphVisualizerGuiPlugin.h:230