diff --git a/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/CMakeLists.txt b/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/CMakeLists.txt index d99bc476290357f0ba9f540fdc50de3d93564ee9..ae64b2e6d82526ff2d7345bbd9ebd02e910ac5fb 100644 --- a/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/CMakeLists.txt +++ b/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/CMakeLists.txt @@ -51,6 +51,7 @@ set(GUI_MOC_HDRS set(GUI_UIS ObserverProperties.ui + widgets/properties/FilterPropertiesDialog.ui ) set(COMPONENT_LIBS ArmarXGui ArmarXCoreObservers ArmarXCoreEigen3Variants ${QT_LIBRARIES}) diff --git a/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/widgets/ObserverWidget.cpp b/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/widgets/ObserverWidget.cpp index 8b62c44723fb1b1062da956c7c48540f9dc46de4..f4ab80e1ffef9b3ce174fe414ec1b8155ab1761e 100644 --- a/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/widgets/ObserverWidget.cpp +++ b/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/widgets/ObserverWidget.cpp @@ -15,9 +15,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package - * @author - * @date + * @package + * @author + * @date * @copyright http://www.gnu.org/licenses/gpl-2.0.txt * GNU General Public License */ @@ -30,7 +30,9 @@ #include <QItemSelectionModel> #include "../ObserverWidgetController.h" #include <ArmarXGui/gui-plugins/ObserverPropertiesPlugin/widgets/properties/DataFieldPropertiesWidget.h> +#include <ArmarXGui/gui-plugins/ObserverPropertiesPlugin/ui_FilterPropertiesDialog.h> #include <ArmarXCore/observers/filters/AverageFilter.h> +#include <ArmarXCore/observers/filters/ButterworthFilter.h> #include <ArmarXCore/observers/filters/GaussianFilter.h> #include <ArmarXCore/observers/filters/MedianFilter.h> @@ -136,21 +138,65 @@ void ObserverWidget::filterSelected() if (action) { auto widget = qobject_cast<DataFieldPropertiesWidget*>(propertiesWidget); - if (action->text() == "MedianFilter") + DatafieldFilterBasePtr filter; + if (action->text() == "Median Filter") { - emit createFilterClicked(widget->getDatafieldIdentifier()->getIdentifierStr(), - new filters::MedianFilter()); + filter = new filters::MedianFilter(); } - else if (action->text() == "AverageFilter") + else if (action->text() == "Average Filter") { - emit createFilterClicked(widget->getDatafieldIdentifier()->getIdentifierStr(), - new filters::AverageFilter()); + filter = new filters::MedianFilter(); + } + else if (action->text() == "Gaussian Filter") + { + filter = new filters::MedianFilter(); + } + else if (action->text() == "Butterworth Filter") + { + filter = new filters::ButterworthFilter(10, 100, Lowpass, 1); } - else if (action->text() == "GaussianFilter") + else { + ARMARX_ERROR << "Filter " << action->text().toStdString() << " is unknown"; + return; + } + QDialog d; + Ui::FilterPropertiesDialog dSetup; + dSetup.setupUi(&d); + dSetup.tableWidget->setSortingEnabled(false); + StringFloatDictionary props = filter->getProperties(); + ARMARX_INFO << VAROUT(props); + dSetup.tableWidget->setRowCount(props.size()); + dSetup.tableWidget->setColumnCount(2); + int i = 0; + for (auto & p : props) + { + auto keyItem = new QTableWidgetItem(p.first.c_str()); + keyItem->setFlags(Qt::ItemIsEnabled); + dSetup.tableWidget->setItem(i, 0, keyItem); + auto valueItem = new QTableWidgetItem(QString::number(p.second)); + dSetup.tableWidget->setItem(i, 1, valueItem); + i++; + } + dSetup.groupBox->setTitle(action->text() + " properties"); + if (d.exec() == QDialog::Accepted) + { + props.clear(); + for (int i = 0; i < dSetup.tableWidget->rowCount(); ++i) + { + bool ok; + float value = dSetup.tableWidget->item(i, 1)->text().toFloat(&ok); + if (ok) + { + props[dSetup.tableWidget->item(i, 0)->text().toStdString()] = value; + } + } + ARMARX_INFO << VAROUT(props); + filter->setProperties(props); emit createFilterClicked(widget->getDatafieldIdentifier()->getIdentifierStr(), - new filters::GaussianFilter()); + filter); } + } } @@ -179,9 +225,10 @@ void ObserverWidget::treeView_contextMenu(const QPoint& point) if (widget) { QMenu* filters = treeViewMenu.addMenu("Filters"); - filters->addAction("MedianFilter", this, SLOT(filterSelected())); - filters->addAction("AverageFilter", this, SLOT(filterSelected())); - filters->addAction("GaussianFilter", this, SLOT(filterSelected())); + filters->addAction("Median Filter", this, SLOT(filterSelected())); + filters->addAction("Average Filter", this, SLOT(filterSelected())); + filters->addAction("Gaussian Filter", this, SLOT(filterSelected())); + filters->addAction("Butterworth Filter", this, SLOT(filterSelected())); } diff --git a/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/widgets/properties/FilterPropertiesDialog.ui b/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/widgets/properties/FilterPropertiesDialog.ui new file mode 100644 index 0000000000000000000000000000000000000000..a0eb05b958a9e47e6c3b2f38ce85ce22778a8acd --- /dev/null +++ b/source/ArmarXGui/gui-plugins/ObserverPropertiesPlugin/widgets/properties/FilterPropertiesDialog.ui @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>FilterPropertiesDialog</class> + <widget class="QDialog" name="FilterPropertiesDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Filter Properties</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QTableWidget" name="tableWidget"/> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>FilterPropertiesDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>FilterPropertiesDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>