se2ez
scenepanel.cpp
Go to the documentation of this file.
1 /* Author: Constantinos Chamzas */
2 
3 #include <se2ez/core/log.h>
4 #include <se2ez/core/io.h>
5 #include <se2ez/core/robot.h>
6 #include <se2ez/core/state.h>
7 #include <se2ez/core/scene.h>
8 #include <se2ez/core/frame.h>
9 #include <se2ez/core/ik.h>
12 
13 #include "se2ez/gui/scenepanel.h"
14 #include "se2ez/gui/jointpanel.h"
15 #include <se2ez/gui/renderarea.h>
16 #include "ui_scenepanel.h"
17 
18 using namespace se2ez;
19 
20 gui::ScenePanel::ScenePanel(ScenePtr scene, std::string name, QWidget *parent)
21  : Panel(name, parent), ui_(new Ui::ScenePanel), scene_(scene)
22 {
23  ui_->setupUi(this);
24  sstate_ = std::make_shared<State>(scene_->getSceneRobot());
25 
26  cm_ = std::make_shared<Box2DCollisionManager>(scene_->getSceneRobot());
27  cm_->compile();
28 
29  // // connecting the signals
30  connect(ui_->geometry, SIGNAL(stateChanged(int)), this, SLOT(updateScene()));
31  connect(ui_->frames, SIGNAL(stateChanged(int)), this, SLOT(updateScene()));
32  connect(ui_->collide, SIGNAL(stateChanged(int)), this, SLOT(updateScene()));
33  connect(ui_->generateGoalsButton, SIGNAL(pressed()), this, SLOT(generateGoals()));
34 }
35 
36 void gui::ScenePanel::update(boost::posix_time::ptime /*last*/, boost::posix_time::ptime /*current*/)
37 {
38  bool update = false;
39  for (const auto &panel : *panels)
40  {
41  if (panelnames_.emplace(panel.first).second) // If new panel was added
42  {
43  auto jpanel = dynamic_cast<gui::JointPanel *>(panel.second);
44  if (jpanel)
45  {
46  // when a passive jpanel updates the scene should get updated too
47  connect(jpanel, SIGNAL(stateChanged()), this, SLOT(updateScene()));
48  // If the joint panel controls the active robot or an environment
49  bool isActive = (jpanel->getSignature().compare(scene_->getSignature()) == 0);
50  isActive ? anames_.emplace(panel.first) : pnames_.emplace(panel.first);
51  update = true;
52  }
53  }
54  }
55 
56  if (update)
57  {
58  ui_->robotComboBox->clear();
59  // Adding the active robots
60  for (const auto &name : anames_)
61  ui_->robotComboBox->addItem(tr(name.c_str()));
62  // Adding the passive robots
63  for (const auto &name : pnames_)
64  {
65  auto box = new QCheckBox(tr(name.c_str()));
66  box->setChecked(true);
67  connect(box, SIGNAL(clicked()), this, SLOT(updateScene()));
68  ui_->passiveBoxes->addWidget(box);
69  }
70  }
71 }
72 
74 {
76 
77  scene_->clear();
78  // adding the passive robots
79  for (int i = 0; i < ui_->passiveBoxes->count(); i++)
80  {
81  auto box = static_cast<QCheckBox *>(ui_->passiveBoxes->itemAt(i)->widget());
82  auto name = box->text();
83  if (box->isChecked())
84  scene_->addRobot(getRobot(name), name.toStdString(), getState(name));
85  }
86  scene_->compileScene();
87 
88  cm_->compile();
89  if (ui_->collide->isChecked())
90  {
91  cm_->collide(sstate_, colliding_);
92  }
93 
94  // setting the active robots state
95  sstate_->copy(getState(ui_->robotComboBox->currentText()));
96 
97  emit stateChanged();
98 }
99 
101 {
102  auto ee = getEE(ui_->robotComboBox->currentText());
103  auto prefix = ui_->lineEditPrefix->text().toStdString();
104  auto builder = std::make_shared<MotionBuilder>(scene_->getSceneRobot(), ee, prefix);
105 
106  auto goals = builder->genGoals(MotionBuilder::FRAME);
107  scene_->getSceneRobot()->setNamedStates(goals);
108 }
109 
110 void gui::ScenePanel::draw(QPainter &painter, gui::RenderArea *canvas)
111 {
113 
114  auto srobot = scene_->getSceneRobot();
115 
116  if (ui_->geometry->isChecked())
117  {
118  canvas->drawGeometry(painter, srobot, sstate_,
119  std::make_shared<RenderArea::CollideDrawer>(ui_->collide->isChecked(),
120  colliding_, srobot, sstate_));
121  }
122 
123  if (ui_->frames->isChecked())
124  canvas->drawAllFrames(painter, srobot, sstate_);
125 }
126 
127 const StatePtr gui::ScenePanel::getState(const QString &s)
128 {
129  auto state = std::make_shared<State>(scene_->getSceneRobot());
130  const std::string &name = s.toStdString();
131 
132  if (pnames_.find(name) != anames_.end())
133  {
134  auto entry = panels->find(name);
135  auto jp = dynamic_cast<gui::JointPanel *>(entry->second);
136  return jp->getState();
137  }
138 
139  SE2EZ_WARN("JointPanel %s does not exist, returning empty state", name);
140  return state;
141 }
142 
143 const std::string gui::ScenePanel::getEE(const QString &s)
144 {
145  const std::string &name = s.toStdString();
146 
147  if (anames_.find(name) != anames_.end())
148  {
149  auto entry = panels->find(name);
150  auto jp = dynamic_cast<JointPanel *>(entry->second);
151  return jp->getEE();
152  }
153 
154  std::string ee = scene_->getActiveRobot()->getEEs()[0];
155  SE2EZ_WARN("JointPanel %s does not exist, returning the first EE %s from the robot", name, ee);
156  return ee;
157 }
158 
159 const RobotPtr gui::ScenePanel::getRobot(const QString &s)
160 {
161  const std::string &name = s.toStdString();
162 
163  if (pnames_.find(name) != pnames_.end())
164  {
165  auto entry = panels->find(name);
166  auto jp = dynamic_cast<JointPanel *>(entry->second);
167  return jp->getRobot();
168  }
169 
170  SE2EZ_WARN("JointPanel %s does not exist, returning empty Robot", name);
171  return std::make_shared<Robot>();
172 }
173 
175 {
176  delete ui_;
177 }
const StatePtr getState(const QString &s)
Definition: scenepanel.cpp:127
A shared pointer wrapper for se2ez::State.
genGoals() returns only states found with IK
Definition: motionbuilder.h:41
Definition: cspacepanel.h:22
ScenePanel(ScenePtr scene, std::string name, QWidget *parent=0)
Definition: scenepanel.cpp:20
T end(T... args)
A shared pointer wrapper for se2ez::Scene.
std::set< std::string > colliding_
Definition: scenepanel.h:66
void drawGeometry(QPainter &painter, RobotPtr robot, StatePtr state, GeometryDrawerPtr drawer=nullptr)
Definition: renderarea.cpp:211
Ui::ScenePanel * ui_
Definition: scenepanel.h:55
void draw(QPainter &painter, RenderArea *canvas) override
Definition: scenepanel.cpp:110
#define SE2EZ_WARN(fmt,...)
Definition: log.h:41
const std::string & getEE()
Definition: jointpanel.cpp:118
void getState(StatePtr state)
Definition: jointpanel.cpp:101
const std::string getEE(const QString &s)
Definition: scenepanel.cpp:143
T find(T... args)
QString name
Definition: panel.h:45
MainWindow::PanelMapPtr panels
Definition: panel.h:46
void drawAllFrames(QPainter &painter, RobotPtr robot, StatePtr state)
Definition: renderarea.cpp:195
A shared pointer wrapper for se2ez::Robot.
std::set< std::string > panelnames_
names of all panels
Definition: scenepanel.h:60
T emplace(T... args)
The canvas widget. It contains all the drawing functions as well as all the general settings for draw...
Definition: renderarea.h:48
const RobotPtr & getRobot()
Definition: jointpanel.cpp:108
Main namespace.
Definition: collision.h:11
std::set< std::string > anames_
names of jpanels of active robots
Definition: scenepanel.h:62
CollisionManagerPtr cm_
Definition: scenepanel.h:65
void update(boost::posix_time::ptime last, boost::posix_time::ptime current) override
Definition: scenepanel.cpp:36
const RobotPtr getRobot(const QString &s)
Definition: scenepanel.cpp:159
std::set< std::string > pnames_
names of jpanels of passive robots
Definition: scenepanel.h:63