42 #include <QApplication>
44 #include <QFormLayout>
45 #include <QHBoxLayout>
48 #include <QMessageBox>
49 #include <QPushButton>
50 #include <QStackedWidget>
52 #include <QTableWidget>
53 #include <QVBoxLayout>
64 QVBoxLayout* layout =
new QVBoxLayout();
69 new HeaderWidget(
"Define Virtual Joints",
70 "Create a virtual joint between the base robot link and an external frame of reference. "
71 "This allows to place the robot in the world or on a mobile platform.",
73 layout->addWidget(header);
77 vjoint_list_widget_ = createContentsWidget();
78 vjoint_edit_widget_ = createEditWidget();
81 stacked_widget_ =
new QStackedWidget(
this);
82 stacked_widget_->addWidget(vjoint_list_widget_);
83 stacked_widget_->addWidget(vjoint_edit_widget_);
84 layout->addWidget(stacked_widget_);
87 this->setLayout(layout);
96 QWidget* content_widget =
new QWidget(
this);
99 QVBoxLayout* layout =
new QVBoxLayout(
this);
106 data_table_->setSelectionBehavior(QAbstractItemView::SelectRows);
112 QStringList header_list;
113 header_list.append(
"Virtual Joint Name");
114 header_list.append(
"Child Link");
115 header_list.append(
"Parent Frame");
116 header_list.append(
"Type");
117 data_table_->setHorizontalHeaderLabels(header_list);
121 QHBoxLayout* controls_layout =
new QHBoxLayout();
124 controls_layout->addItem(
new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));
127 btn_edit_ =
new QPushButton(
"&Edit Selected",
this);
128 btn_edit_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
133 controls_layout->setAlignment(
btn_edit_, Qt::AlignRight);
136 btn_delete_ =
new QPushButton(
"&Delete Selected",
this);
139 controls_layout->setAlignment(
btn_delete_, Qt::AlignRight);
142 QPushButton* btn_add =
new QPushButton(
"&Add Virtual Joint",
this);
143 btn_add->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
144 btn_add->setMaximumWidth(300);
146 controls_layout->addWidget(btn_add);
147 controls_layout->setAlignment(btn_add, Qt::AlignRight);
150 layout->addLayout(controls_layout);
153 content_widget->setLayout(layout);
155 return content_widget;
164 QWidget* edit_widget =
new QWidget(
this);
166 QVBoxLayout* layout =
new QVBoxLayout();
169 QFormLayout* form_layout =
new QFormLayout();
171 form_layout->setRowWrapPolicy(QFormLayout::WrapAllRows);
194 layout->addLayout(form_layout);
198 QHBoxLayout* controls_layout =
new QHBoxLayout();
199 controls_layout->setContentsMargins(0, 25, 0, 15);
202 controls_layout->addItem(
new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));
205 QPushButton* btn_save =
new QPushButton(
"&Save",
this);
206 btn_save->setMaximumWidth(200);
208 controls_layout->addWidget(btn_save);
209 controls_layout->setAlignment(btn_save, Qt::AlignRight);
212 QPushButton* btn_cancel =
new QPushButton(
"&Cancel",
this);
213 btn_cancel->setMaximumWidth(200);
215 controls_layout->addWidget(btn_cancel);
216 controls_layout->setAlignment(btn_cancel, Qt::AlignRight);
219 layout->addLayout(controls_layout);
222 edit_widget->setLayout(layout);
269 QList<QTableWidgetItem*> selected =
data_table_->selectedItems();
272 if (selected.empty())
276 edit(selected[0]->
text().toStdString());
298 QMessageBox::critical(
this,
"Error Loading",
"Unable to find child link in drop down box");
307 QMessageBox::critical(
this,
"Error Loading",
"Unable to find joint type in drop down box");
342 std::vector<const moveit::core::LinkModel*> link_models =
config_data_->getRobotModel()->getLinkModels();
345 for (std::vector<const moveit::core::LinkModel*>::const_iterator link_it = link_models.begin();
346 link_it < link_models.end(); ++link_it)
364 searched_group = &virtual_joint;
370 if (searched_group ==
nullptr)
372 QMessageBox::critical(
this,
"Error Saving",
"An internal error has occured while saving. Quitting.");
373 QApplication::quit();
376 return searched_group;
385 QList<QTableWidgetItem*> selected =
data_table_->selectedItems();
388 if (selected.empty())
395 if (QMessageBox::question(
this,
"Confirm Virtual Joint Deletion",
396 QString(
"Are you sure you want to delete the virtual joint '")
399 QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel)
405 for (std::vector<srdf::Model::VirtualJoint>::iterator vjoint_it =
config_data_->srdf_->virtual_joints_.begin();
406 vjoint_it !=
config_data_->srdf_->virtual_joints_.end(); ++vjoint_it)
435 if (vjoint_name.empty())
437 QMessageBox::warning(
this,
"Error Saving",
"A name must be given for the virtual joint!");
442 if (parent_name.empty())
444 QMessageBox::warning(
this,
"Error Saving",
"A name must be given for the parent frame");
456 for (
const auto& virtual_joint :
config_data_->srdf_->virtual_joints_)
458 if (virtual_joint.
name_.compare(vjoint_name) == 0)
461 if (&virtual_joint != searched_data)
463 QMessageBox::warning(
this,
"Error Saving",
"A virtual joint already exists with that name!");
472 QMessageBox::warning(
this,
"Error Saving",
"A joint type must be chosen!");
479 QMessageBox::warning(
this,
"Error Saving",
"A child link must be chosen!");
488 if (searched_data ==
nullptr)
495 searched_data->
name_ = vjoint_name;
500 bool emit_frame_notice =
false;
506 emit_frame_notice =
true;
507 config_data_->srdf_->virtual_joints_.push_back(*searched_data);
509 delete searched_data;
524 if (emit_frame_notice)
557 for (
const auto& virtual_joint :
config_data_->srdf_->virtual_joints_)
560 QTableWidgetItem* data_name =
new QTableWidgetItem(virtual_joint.
name_.c_str());
561 data_name->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
562 QTableWidgetItem* child_link_name =
new QTableWidgetItem(virtual_joint.
child_link_.c_str());
563 child_link_name->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
564 QTableWidgetItem* parent_frame_name =
new QTableWidgetItem(virtual_joint.
parent_frame_.c_str());
565 parent_frame_name->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
566 QTableWidgetItem* type_name =
new QTableWidgetItem(virtual_joint.
type_.c_str());
567 type_name->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);