42 #include <QApplication>
44 #include <QFormLayout>
46 #include <QHBoxLayout>
49 #include <QMessageBox>
50 #include <QPushButton>
51 #include <QScrollArea>
52 #include <QStackedWidget>
54 #include <QTableWidget>
55 #include <QVBoxLayout>
67 QVBoxLayout* layout =
new QVBoxLayout();
71 HeaderWidget*
header =
new HeaderWidget(
"Define End Effectors",
72 "Setup your robot's end effectors. These are planning groups "
73 "corresponding to grippers or tools, attached to a parent "
74 "planning group (an arm). The specified parent link is used as the "
75 "reference frame for IK attempts.",
77 layout->addWidget(header);
81 effector_list_widget_ = createContentsWidget();
82 effector_edit_widget_ = createEditWidget();
85 stacked_widget_ =
new QStackedWidget(
this);
86 stacked_widget_->addWidget(effector_list_widget_);
87 stacked_widget_->addWidget(effector_edit_widget_);
88 layout->addWidget(stacked_widget_);
91 this->setLayout(layout);
100 QWidget* content_widget =
new QWidget(
this);
103 QVBoxLayout* layout =
new QVBoxLayout(
this);
110 data_table_->setSelectionBehavior(QAbstractItemView::SelectRows);
116 QStringList header_list;
117 header_list.append(
"End Effector Name");
118 header_list.append(
"Group Name");
119 header_list.append(
"Parent Link");
120 header_list.append(
"Parent Group");
121 data_table_->setHorizontalHeaderLabels(header_list);
125 QHBoxLayout* controls_layout =
new QHBoxLayout();
128 controls_layout->addItem(
new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));
131 btn_edit_ =
new QPushButton(
"&Edit Selected",
this);
132 btn_edit_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
137 controls_layout->setAlignment(
btn_edit_, Qt::AlignRight);
140 btn_delete_ =
new QPushButton(
"&Delete Selected",
this);
143 controls_layout->setAlignment(
btn_delete_, Qt::AlignRight);
146 QPushButton* btn_add =
new QPushButton(
"&Add End Effector",
this);
147 btn_add->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
148 btn_add->setMaximumWidth(300);
150 controls_layout->addWidget(btn_add);
151 controls_layout->setAlignment(btn_add, Qt::AlignRight);
154 layout->addLayout(controls_layout);
157 content_widget->setLayout(layout);
159 return content_widget;
168 QWidget* edit_widget =
new QWidget(
this);
170 QVBoxLayout* layout =
new QVBoxLayout();
173 QFormLayout* form_layout =
new QFormLayout();
175 form_layout->setRowWrapPolicy(QFormLayout::WrapAllRows);
197 layout->addLayout(form_layout);
201 QHBoxLayout* controls_layout =
new QHBoxLayout();
202 controls_layout->setContentsMargins(0, 25, 0, 15);
205 controls_layout->addItem(
new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));
208 btn_save_ =
new QPushButton(
"&Save",
this);
212 controls_layout->setAlignment(
btn_save_, Qt::AlignRight);
219 controls_layout->setAlignment(
btn_cancel_, Qt::AlignRight);
222 layout->addLayout(controls_layout);
225 edit_widget->setLayout(layout);
268 if (selected.empty())
303 QList<QTableWidgetItem*> selected =
data_table_->selectedItems();
306 if (selected.empty())
310 edit(selected[0]->
text().toStdString());
331 QMessageBox::critical(
this,
"Error Loading",
"Unable to find parent link in drop down box");
340 QMessageBox::critical(
this,
"Error Loading",
"Unable to find group name in drop down box");
349 QMessageBox::critical(
this,
"Error Loading",
"Unable to find parent group name in drop down box");
388 std::vector<const moveit::core::LinkModel*> link_models =
config_data_->getRobotModel()->getLinkModels();
391 for (std::vector<const moveit::core::LinkModel*>::const_iterator link_it = link_models.begin();
392 link_it < link_models.end(); ++link_it)
410 searched_group = &end_effector;
416 if (searched_group ==
nullptr)
418 QMessageBox::critical(
this,
"Error Saving",
"An internal error has occured while saving. Quitting.");
419 QApplication::quit();
422 return searched_group;
431 QList<QTableWidgetItem*> selected =
data_table_->selectedItems();
434 if (selected.empty())
441 if (QMessageBox::question(
this,
"Confirm End Effector Deletion",
442 QString(
"Are you sure you want to delete the end effector '")
445 QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel)
451 for (std::vector<srdf::Model::EndEffector>::iterator effector_it =
config_data_->srdf_->end_effectors_.begin();
452 effector_it !=
config_data_->srdf_->end_effectors_.end(); ++effector_it)
479 if (effector_name.empty())
481 QMessageBox::warning(
this,
"Error Saving",
"A name must be specified for the end effector!");
493 for (
const auto& eef :
config_data_->srdf_->end_effectors_)
495 if (eef.name_ == effector_name)
498 if (&eef != searched_data)
500 QMessageBox::warning(
501 this,
"Error Saving",
502 QString(
"An end-effector named '").
append(effector_name.c_str()).append(
"'already exists!"));
511 QMessageBox::warning(
this,
"Error Saving",
"A group that contains the links of the end-effector must be chosen!");
518 QMessageBox::warning(
this,
"Error Saving",
"A parent link must be chosen!");
539 QMessageBox::warning(
this,
"Error Saving",
540 QString::fromStdString(
"The specified parent group '" +
542 "' must contain the specified parent link '" +
553 if (searched_data ==
nullptr)
561 searched_data->
name_ = effector_name;
569 config_data_->srdf_->end_effectors_.push_back(*searched_data);
570 delete searched_data;
615 for (
const auto& eef :
config_data_->srdf_->end_effectors_)
618 QTableWidgetItem* data_name =
new QTableWidgetItem(eef.name_.c_str());
619 data_name->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
620 QTableWidgetItem* group_name =
new QTableWidgetItem(eef.component_group_.c_str());
621 group_name->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
622 QTableWidgetItem* parent_name =
new QTableWidgetItem(eef.parent_link_.c_str());
623 group_name->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
624 QTableWidgetItem* parent_group_name =
new QTableWidgetItem(eef.parent_group_.c_str());
625 parent_group_name->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);