end_effectors_widget.cpp
Go to the documentation of this file.
1 /*********************************************************************
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2012, Willow Garage, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above
14  * copyright notice, this list of conditions and the following
15  * disclaimer in the documentation and/or other materials provided
16  * with the distribution.
17  * * Neither the name of Willow Garage nor the names of its
18  * contributors may be used to endorse or promote products derived
19  * from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *********************************************************************/
34 
35 /* Author: Dave Coleman */
36 
37 // SA
38 #include "end_effectors_widget.h"
39 #include "header_widget.h"
40 
41 // Qt
42 #include <QApplication>
43 #include <QComboBox>
44 #include <QFormLayout>
45 #include <QGroupBox>
46 #include <QHBoxLayout>
47 #include <QLabel>
48 #include <QLineEdit>
49 #include <QMessageBox>
50 #include <QPushButton>
51 #include <QScrollArea>
52 #include <QStackedWidget>
53 #include <QString>
54 #include <QTableWidget>
55 #include <QVBoxLayout>
56 #include <QWidget>
57 
58 namespace moveit_setup_assistant
59 {
60 // ******************************************************************************************
61 // Constructor
62 // ******************************************************************************************
63 EndEffectorsWidget::EndEffectorsWidget(QWidget* parent, const MoveItConfigDataPtr& config_data)
64  : SetupScreenWidget(parent), config_data_(config_data)
65 {
66  // Basic widget container
67  QVBoxLayout* layout = new QVBoxLayout();
68 
69  // Top Header Area ------------------------------------------------
70 
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.",
76  this);
77  layout->addWidget(header);
78 
79  // Create contents screens ---------------------------------------
80 
81  effector_list_widget_ = createContentsWidget();
82  effector_edit_widget_ = createEditWidget();
83 
84  // Create stacked layout -----------------------------------------
85  stacked_widget_ = new QStackedWidget(this);
86  stacked_widget_->addWidget(effector_list_widget_); // screen index 0
87  stacked_widget_->addWidget(effector_edit_widget_); // screen index 1
88  layout->addWidget(stacked_widget_);
89 
90  // Finish Layout --------------------------------------------------
91  this->setLayout(layout);
92 }
93 
94 // ******************************************************************************************
95 // Create the main content widget
96 // ******************************************************************************************
98 {
99  // Main widget
100  QWidget* content_widget = new QWidget(this);
101 
102  // Basic widget container
103  QVBoxLayout* layout = new QVBoxLayout(this);
104 
105  // Table ------------ ------------------------------------------------
106 
107  data_table_ = new QTableWidget(this);
108  data_table_->setColumnCount(4);
109  data_table_->setSortingEnabled(true);
110  data_table_->setSelectionBehavior(QAbstractItemView::SelectRows);
111  connect(data_table_, &QTableWidget::cellDoubleClicked, this, &EndEffectorsWidget::editDoubleClicked);
112  connect(data_table_, &QTableWidget::cellClicked, this, &EndEffectorsWidget::previewClicked);
113  layout->addWidget(data_table_);
114 
115  // Set header labels
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);
122 
123  // Bottom Buttons --------------------------------------------------
124 
125  QHBoxLayout* controls_layout = new QHBoxLayout();
126 
127  // Spacer
128  controls_layout->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));
129 
130  // Edit Selected Button
131  btn_edit_ = new QPushButton("&Edit Selected", this);
132  btn_edit_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
133  btn_edit_->setMaximumWidth(300);
134  btn_edit_->hide(); // show once we know if there are existing poses
135  connect(btn_edit_, &QPushButton::clicked, this, &EndEffectorsWidget::editSelected);
136  controls_layout->addWidget(btn_edit_);
137  controls_layout->setAlignment(btn_edit_, Qt::AlignRight);
138 
139  // Delete Selected Button
140  btn_delete_ = new QPushButton("&Delete Selected", this);
141  connect(btn_delete_, &QPushButton::clicked, this, &EndEffectorsWidget::deleteSelected);
142  controls_layout->addWidget(btn_delete_);
143  controls_layout->setAlignment(btn_delete_, Qt::AlignRight);
144 
145  // Add end effector Button
146  QPushButton* btn_add = new QPushButton("&Add End Effector", this);
147  btn_add->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
148  btn_add->setMaximumWidth(300);
149  connect(btn_add, &QPushButton::clicked, this, &EndEffectorsWidget::showNewScreen);
150  controls_layout->addWidget(btn_add);
151  controls_layout->setAlignment(btn_add, Qt::AlignRight);
152 
153  // Add layout
154  layout->addLayout(controls_layout);
155 
156  // Set layout -----------------------------------------------------
157  content_widget->setLayout(layout);
158 
159  return content_widget;
160 }
161 
162 // ******************************************************************************************
163 // Create the edit widget
164 // ******************************************************************************************
166 {
167  // Main widget
168  QWidget* edit_widget = new QWidget(this);
169  // Layout
170  QVBoxLayout* layout = new QVBoxLayout();
171 
172  // Simple form -------------------------------------------
173  QFormLayout* form_layout = new QFormLayout();
174  // form_layout->setContentsMargins( 0, 15, 0, 15 );
175  form_layout->setRowWrapPolicy(QFormLayout::WrapAllRows);
176 
177  // Name input
178  effector_name_field_ = new QLineEdit(this);
179  form_layout->addRow("End Effector Name:", effector_name_field_);
180 
181  // Group input
182  group_name_field_ = new QComboBox(this);
183  group_name_field_->setEditable(false);
184  form_layout->addRow("End Effector Group:", group_name_field_);
185  connect(group_name_field_, &QComboBox::currentTextChanged, this, &EndEffectorsWidget::previewClickedString);
186 
187  // Parent Link input
188  parent_name_field_ = new QComboBox(this);
189  parent_name_field_->setEditable(false);
190  form_layout->addRow("Parent Link (usually part of the arm):", parent_name_field_);
191 
192  // Parent Group input
193  parent_group_name_field_ = new QComboBox(this);
194  parent_group_name_field_->setEditable(false);
195  form_layout->addRow("Parent Group (optional):", parent_group_name_field_);
196 
197  layout->addLayout(form_layout);
198 
199  // Bottom Buttons --------------------------------------------------
200 
201  QHBoxLayout* controls_layout = new QHBoxLayout();
202  controls_layout->setContentsMargins(0, 25, 0, 15);
203 
204  // Spacer
205  controls_layout->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));
206 
207  // Save
208  btn_save_ = new QPushButton("&Save", this);
209  btn_save_->setMaximumWidth(200);
210  connect(btn_save_, &QPushButton::clicked, this, &EndEffectorsWidget::doneEditing);
211  controls_layout->addWidget(btn_save_);
212  controls_layout->setAlignment(btn_save_, Qt::AlignRight);
213 
214  // Cancel
215  btn_cancel_ = new QPushButton("&Cancel", this);
216  btn_cancel_->setMaximumWidth(200);
217  connect(btn_cancel_, &QPushButton::clicked, this, &EndEffectorsWidget::cancelEditing);
218  controls_layout->addWidget(btn_cancel_);
219  controls_layout->setAlignment(btn_cancel_, Qt::AlignRight);
220 
221  // Add layout
222  layout->addLayout(controls_layout);
223 
224  // Set layout -----------------------------------------------------
225  edit_widget->setLayout(layout);
226 
227  return edit_widget;
228 }
229 
230 // ******************************************************************************************
231 // Show edit screen for creating a new effector
232 // ******************************************************************************************
234 {
235  // Remember that this is a new effector
236  current_edit_effector_.clear();
237 
238  // Clear previous data
239  effector_name_field_->setText("");
240  parent_name_field_->clearEditText();
241  group_name_field_->clearEditText(); // actually this just chooses first option
242  parent_group_name_field_->clearEditText(); // actually this just chooses first option
243 
244  // Switch to screen
245  stacked_widget_->setCurrentIndex(1);
246 
247  // Announce that this widget is in modal mode
248  Q_EMIT isModal(true);
249 }
250 
251 // ******************************************************************************************
252 // Edit whatever element is selected
253 // ******************************************************************************************
254 void EndEffectorsWidget::editDoubleClicked(int /*row*/, int /*column*/)
255 {
256  editSelected();
257 }
258 
259 // ******************************************************************************************
260 // Preview whatever element is selected
261 // ******************************************************************************************
262 void EndEffectorsWidget::previewClicked(int /*row*/, int /*column*/)
263 {
264  // Get list of all selected items
265  QList<QTableWidgetItem*> selected = data_table_->selectedItems();
266 
267  // Check that an element was selected
268  if (selected.empty())
269  return;
270 
271  // Find the selected in datastructure
272  srdf::Model::EndEffector* effector = findEffectorByName(selected[0]->text().toStdString());
273 
274  // Unhighlight all links
275  Q_EMIT unhighlightAll();
276 
277  // Highlight group
278  Q_EMIT highlightGroup(effector->component_group_);
279 }
280 
281 // ******************************************************************************************
282 // Preview the planning group that is selected
283 // ******************************************************************************************
284 void EndEffectorsWidget::previewClickedString(const QString& name)
285 {
286  // Don't highlight if we are on the overview end effectors screen. we are just populating drop down box
287  if (stacked_widget_->currentIndex() == 0)
288  return;
289 
290  // Unhighlight all links
291  Q_EMIT unhighlightAll();
292 
293  // Highlight group
294  Q_EMIT highlightGroup(name.toStdString());
295 }
296 
297 // ******************************************************************************************
298 // Edit whatever element is selected
299 // ******************************************************************************************
301 {
302  // Get list of all selected items
303  QList<QTableWidgetItem*> selected = data_table_->selectedItems();
304 
305  // Check that an element was selected
306  if (selected.empty())
307  return;
308 
309  // Get selected name and edit it
310  edit(selected[0]->text().toStdString());
311 }
312 
313 // ******************************************************************************************
314 // Edit effector
315 // ******************************************************************************************
316 void EndEffectorsWidget::edit(const std::string& name)
317 {
318  // Remember what we are editing
320 
321  // Find the selected in datastruture
323 
324  // Set effector name
325  effector_name_field_->setText(effector->name_.c_str());
326 
327  // Set effector parent link
328  int index = parent_name_field_->findText(effector->parent_link_.c_str());
329  if (index == -1)
330  {
331  QMessageBox::critical(this, "Error Loading", "Unable to find parent link in drop down box");
332  return;
333  }
334  parent_name_field_->setCurrentIndex(index);
335 
336  // Set group:
337  index = group_name_field_->findText(effector->component_group_.c_str());
338  if (index == -1)
339  {
340  QMessageBox::critical(this, "Error Loading", "Unable to find group name in drop down box");
341  return;
342  }
343  group_name_field_->setCurrentIndex(index);
344 
345  // Set parent group:
346  index = parent_group_name_field_->findText(effector->parent_group_.c_str());
347  if (index == -1)
348  {
349  QMessageBox::critical(this, "Error Loading", "Unable to find parent group name in drop down box");
350  return;
351  }
352  parent_group_name_field_->setCurrentIndex(index);
353 
354  // Switch to screen
355  stacked_widget_->setCurrentIndex(1);
356 
357  // Announce that this widget is in modal mode
358  Q_EMIT isModal(true);
359 }
360 
361 // ******************************************************************************************
362 // Populate the combo dropdown box with avail group names
363 // ******************************************************************************************
365 {
366  // Remove all old groups
367  group_name_field_->clear();
368  parent_group_name_field_->clear();
369  parent_group_name_field_->addItem(""); // optional setting
370 
371  // Add all group names to combo box
372  for (srdf::Model::Group& group : config_data_->srdf_->groups_)
373  {
374  group_name_field_->addItem(group.name_.c_str());
375  parent_group_name_field_->addItem(group.name_.c_str());
376  }
377 }
378 
379 // ******************************************************************************************
380 // Populate the combo dropdown box with avail parent links
381 // ******************************************************************************************
383 {
384  // Remove all old groups
385  parent_name_field_->clear();
386 
387  // Get all links in robot model
388  std::vector<const moveit::core::LinkModel*> link_models = config_data_->getRobotModel()->getLinkModels();
389 
390  // Add all links to combo box
391  for (std::vector<const moveit::core::LinkModel*>::const_iterator link_it = link_models.begin();
392  link_it < link_models.end(); ++link_it)
393  {
394  parent_name_field_->addItem((*link_it)->getName().c_str());
395  }
396 }
397 
398 // ******************************************************************************************
399 // Find the associated data by name
400 // ******************************************************************************************
402 {
403  // Find the group state we are editing based on the effector name
404  srdf::Model::EndEffector* searched_group = nullptr; // used for holding our search results
405 
406  for (srdf::Model::EndEffector& end_effector : config_data_->srdf_->end_effectors_)
407  {
408  if (end_effector.name_ == name) // string match
409  {
410  searched_group = &end_effector; // convert to pointer from iterator
411  break; // we are done searching
412  }
413  }
414 
415  // Check if effector was found
416  if (searched_group == nullptr) // not found
417  {
418  QMessageBox::critical(this, "Error Saving", "An internal error has occured while saving. Quitting.");
419  QApplication::quit();
420  }
421 
422  return searched_group;
423 }
424 
425 // ******************************************************************************************
426 // Delete currently editing item
427 // ******************************************************************************************
429 {
430  // Get list of all selected items
431  QList<QTableWidgetItem*> selected = data_table_->selectedItems();
432 
433  // Check that an element was selected
434  if (selected.empty())
435  return;
436 
437  // Get selected name and edit it
438  current_edit_effector_ = selected[0]->text().toStdString();
439 
440  // Confirm user wants to delete group
441  if (QMessageBox::question(this, "Confirm End Effector Deletion",
442  QString("Are you sure you want to delete the end effector '")
444  .append("'?"),
445  QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel)
446  {
447  return;
448  }
449 
450  // Delete effector from vector
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)
453  {
454  // check if this is the group we want to delete
455  if (effector_it->name_ == current_edit_effector_) // string match
456  {
457  config_data_->srdf_->end_effectors_.erase(effector_it);
458  break;
459  }
460  }
461 
462  // Reload main screen table
463  loadDataTable();
465 }
466 
467 // ******************************************************************************************
468 // Save editing changes
469 // ******************************************************************************************
471 {
472  // Get a reference to the supplied strings
473  const std::string effector_name = effector_name_field_->text().toStdString();
474 
475  // Used for editing existing groups
476  srdf::Model::EndEffector* searched_data = nullptr;
477 
478  // Check that name field is not empty
479  if (effector_name.empty())
480  {
481  QMessageBox::warning(this, "Error Saving", "A name must be specified for the end effector!");
482  return;
483  }
484 
485  // Check if this is an existing group
486  if (!current_edit_effector_.empty())
487  {
488  // Find the group we are editing based on the goup name string
490  }
491 
492  // Check that the effector name is unique
493  for (const auto& eef : config_data_->srdf_->end_effectors_)
494  {
495  if (eef.name_ == effector_name)
496  {
497  // is this our existing effector? check if effector pointers are same
498  if (&eef != searched_data)
499  {
500  QMessageBox::warning(
501  this, "Error Saving",
502  QString("An end-effector named '").append(effector_name.c_str()).append("'already exists!"));
503  return;
504  }
505  }
506  }
507 
508  // Check that a group was selected
509  if (group_name_field_->currentText().isEmpty())
510  {
511  QMessageBox::warning(this, "Error Saving", "A group that contains the links of the end-effector must be chosen!");
512  return;
513  }
514 
515  // Check that a parent link was selected
516  if (parent_name_field_->currentText().isEmpty())
517  {
518  QMessageBox::warning(this, "Error Saving", "A parent link must be chosen!");
519  return;
520  }
521 
522  const moveit::core::JointModelGroup* jmg =
523  config_data_->getRobotModel()->getJointModelGroup(group_name_field_->currentText().toStdString());
524  /*
525  if (jmg->hasLinkModel(parent_name_field_->currentText().toStdString()))
526  {
527  QMessageBox::warning( this, "Error Saving", QString::fromStdString("Group " +
528  group_name_field_->currentText().toStdString() + " contains the link " +
529  parent_name_field_->currentText().toStdString() + ". However, the parent link of the end-effector should not belong to
530  the group for the end-effector itself."));
531  return;
532  }
533  */
534  if (!parent_group_name_field_->currentText().isEmpty())
535  {
536  jmg = config_data_->getRobotModel()->getJointModelGroup(parent_group_name_field_->currentText().toStdString());
537  if (!jmg->hasLinkModel(parent_name_field_->currentText().toStdString()))
538  {
539  QMessageBox::warning(this, "Error Saving",
540  QString::fromStdString("The specified parent group '" +
541  parent_group_name_field_->currentText().toStdString() +
542  "' must contain the specified parent link '" +
543  parent_name_field_->currentText().toStdString() + "'."));
544  return;
545  }
546  }
547 
549 
550  // Save the new effector name or create the new effector ----------------------------
551  bool is_new = false;
552 
553  if (searched_data == nullptr) // create new
554  {
555  is_new = true;
556 
557  searched_data = new srdf::Model::EndEffector();
558  }
559 
560  // Copy name data ----------------------------------------------------
561  searched_data->name_ = effector_name;
562  searched_data->parent_link_ = parent_name_field_->currentText().toStdString();
563  searched_data->component_group_ = group_name_field_->currentText().toStdString();
564  searched_data->parent_group_ = parent_group_name_field_->currentText().toStdString();
565 
566  // Insert new effectors into group state vector --------------------------
567  if (is_new)
568  {
569  config_data_->srdf_->end_effectors_.push_back(*searched_data);
570  delete searched_data;
571  }
572 
573  // Finish up ------------------------------------------------------
574 
575  // Reload main screen table
576  loadDataTable();
577 
578  // Switch to screen
579  stacked_widget_->setCurrentIndex(0);
580 
581  // Announce that this widget is not in modal mode
582  Q_EMIT isModal(false);
583 }
584 
585 // ******************************************************************************************
586 // Cancel changes
587 // ******************************************************************************************
589 {
590  // Switch to screen
591  stacked_widget_->setCurrentIndex(0);
592 
593  // Re-highlight the currently selected end effector group
594  previewClicked(0, 0); // the number parameters are actually meaningless
595 
596  // Announce that this widget is not in modal mode
597  Q_EMIT isModal(false);
598 }
599 
600 // ******************************************************************************************
601 // Load the end effectors into the table
602 // ******************************************************************************************
604 {
605  // Disable Table
606  data_table_->setUpdatesEnabled(false); // prevent table from updating until we are completely done
607  data_table_->setDisabled(true); // make sure we disable it so that the cellChanged event is not called
608  data_table_->clearContents();
609 
610  // Set size of datatable
611  data_table_->setRowCount(config_data_->srdf_->end_effectors_.size());
612 
613  // Loop through every end effector
614  int row = 0;
615  for (const auto& eef : config_data_->srdf_->end_effectors_)
616  {
617  // Create row elements
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);
626 
627  // Add to table
628  data_table_->setItem(row, 0, data_name);
629  data_table_->setItem(row, 1, group_name);
630  data_table_->setItem(row, 2, parent_name);
631  data_table_->setItem(row, 3, parent_group_name);
632 
633  // Increment counter
634  ++row;
635  }
636 
637  // Reenable
638  data_table_->setUpdatesEnabled(true); // prevent table from updating until we are completely done
639  data_table_->setDisabled(false); // make sure we disable it so that the cellChanged event is not called
640 
641  // Resize header
642  data_table_->resizeColumnToContents(0);
643  data_table_->resizeColumnToContents(1);
644  data_table_->resizeColumnToContents(2);
645  data_table_->resizeColumnToContents(3);
646 
647  // Show edit button if applicable
648  if (!config_data_->srdf_->end_effectors_.empty())
649  btn_edit_->show();
650 }
651 
652 // ******************************************************************************************
653 // Called when setup assistant navigation switches to this screen
654 // ******************************************************************************************
656 {
657  // Show the current effectors screen
658  stacked_widget_->setCurrentIndex(0);
659 
660  // Load the data to the tree
661  loadDataTable();
662 
663  // Load the avail groups to the combo box
666 }
667 
668 } // namespace moveit_setup_assistant
moveit::core::JointModelGroup::hasLinkModel
bool hasLinkModel(const std::string &link) const
srdf::Model::EndEffector::component_group_
std::string component_group_
moveit_setup_assistant::EndEffectorsWidget::previewClickedString
void previewClickedString(const QString &name)
Preview the planning group that is selected.
Definition: end_effectors_widget.cpp:316
srdf::Model::EndEffector::name_
std::string name_
moveit_setup_assistant::EndEffectorsWidget::loadParentComboBox
void loadParentComboBox()
Definition: end_effectors_widget.cpp:414
moveit_setup_assistant::EndEffectorsWidget::cancelEditing
void cancelEditing()
Cancel changes.
Definition: end_effectors_widget.cpp:620
end_effectors_widget.h
moveit_setup_assistant::EndEffectorsWidget::current_edit_effector_
std::string current_edit_effector_
Orignal name of effector currently being edited. This is used to find the element in the vector.
Definition: end_effectors_widget.h:124
moveit_setup_assistant::EndEffectorsWidget::config_data_
moveit_setup_assistant::MoveItConfigDataPtr config_data_
Contains all the configuration data for the setup assistant.
Definition: end_effectors_widget.h:121
moveit_setup_assistant::EndEffectorsWidget::editDoubleClicked
void editDoubleClicked(int row, int column)
Edit the double clicked element.
Definition: end_effectors_widget.cpp:286
moveit_setup_assistant::EndEffectorsWidget::btn_edit_
QPushButton * btn_edit_
Definition: end_effectors_widget.h:73
moveit_setup_assistant::EndEffectorsWidget::edit
void edit(const std::string &name)
Definition: end_effectors_widget.cpp:348
moveit_setup_assistant::EndEffectorsWidget::effector_name_field_
QLineEdit * effector_name_field_
Definition: end_effectors_widget.h:78
moveit_setup_assistant::EndEffectorsWidget::parent_group_name_field_
QComboBox * parent_group_name_field_
Definition: end_effectors_widget.h:80
SetupScreenWidget::isModal
void isModal(bool isModal)
Event for when the current screen is in modal view. Essential disabled the left navigation.
moveit_setup_assistant::EndEffectorsWidget::createContentsWidget
QWidget * createContentsWidget()
Definition: end_effectors_widget.cpp:129
moveit_setup_assistant::EndEffectorsWidget::btn_cancel_
QPushButton * btn_cancel_
Definition: end_effectors_widget.h:76
moveit_setup_assistant::EndEffectorsWidget::showNewScreen
void showNewScreen()
Show edit screen.
Definition: end_effectors_widget.cpp:265
moveit_setup_assistant::EndEffectorsWidget::EndEffectorsWidget
EndEffectorsWidget(QWidget *parent, const MoveItConfigDataPtr &config_data)
Definition: end_effectors_widget.cpp:95
moveit_setup_assistant::EndEffectorsWidget::group_name_field_
QComboBox * group_name_field_
Definition: end_effectors_widget.h:81
moveit_setup_assistant::EndEffectorsWidget::parent_name_field_
QComboBox * parent_name_field_
Definition: end_effectors_widget.h:79
srdf::Model::EndEffector::parent_link_
std::string parent_link_
moveit_setup_assistant::EndEffectorsWidget::focusGiven
void focusGiven() override
Received when this widget is chosen from the navigation menu.
Definition: end_effectors_widget.cpp:687
moveit_setup_assistant::MoveItConfigData::END_EFFECTORS
@ END_EFFECTORS
Definition: moveit_config_data.h:234
moveit_setup_assistant::EndEffectorsWidget::doneEditing
void doneEditing()
Save editing changes.
Definition: end_effectors_widget.cpp:502
moveit_setup_assistant::EndEffectorsWidget::editSelected
void editSelected()
Edit whatever element is selected.
Definition: end_effectors_widget.cpp:332
moveit_setup_assistant::EndEffectorsWidget::data_table_
QTableWidget * data_table_
Definition: end_effectors_widget.h:72
SetupScreenWidget
Definition: setup_screen_widget.h:44
moveit_setup_assistant::EndEffectorsWidget::loadDataTable
void loadDataTable()
Definition: end_effectors_widget.cpp:635
SetupScreenWidget::unhighlightAll
void unhighlightAll()
Event for telling rviz to unhighlight all links of the robot.
name
name
header_widget.h
moveit_setup_assistant
Definition: compute_default_collisions.h:46
text
text
moveit_setup_assistant::EndEffectorsWidget::deleteSelected
void deleteSelected()
Delete currently editing ite.
Definition: end_effectors_widget.cpp:460
moveit_setup_assistant::EndEffectorsWidget::btn_save_
QPushButton * btn_save_
Definition: end_effectors_widget.h:75
append
ROSCPP_DECL std::string append(const std::string &left, const std::string &right)
moveit::core::JointModelGroup
index
unsigned int index
srdf::Model::EndEffector::parent_group_
std::string parent_group_
moveit_setup_assistant::EndEffectorsWidget::createEditWidget
QWidget * createEditWidget()
Definition: end_effectors_widget.cpp:197
srdf::Model::Group
header
const std::string header
moveit_setup_assistant::EndEffectorsWidget::findEffectorByName
srdf::Model::EndEffector * findEffectorByName(const std::string &name)
Definition: end_effectors_widget.cpp:433
moveit_setup_assistant::EndEffectorsWidget::btn_delete_
QPushButton * btn_delete_
Definition: end_effectors_widget.h:74
SetupScreenWidget::highlightGroup
void highlightGroup(const std::string &name)
Event for telling rviz to highlight a group of the robot.
moveit_setup_assistant::EndEffectorsWidget::loadGroupsComboBox
void loadGroupsComboBox()
Definition: end_effectors_widget.cpp:396
moveit_setup_assistant::EndEffectorsWidget::stacked_widget_
QStackedWidget * stacked_widget_
Definition: end_effectors_widget.h:77
srdf::Model::EndEffector
moveit_setup_assistant::EndEffectorsWidget::previewClicked
void previewClicked(int row, int column)
Preview whatever element is selected.
Definition: end_effectors_widget.cpp:294
group
group


moveit_setup_assistant
Author(s): Dave Coleman
autogenerated on Sat May 3 2025 02:28:04