summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhirui Dai2023-10-11 02:40:23 -0700
committerZhirui Dai2023-10-11 02:40:23 -0700
commit0f87e031370fde6c63b7ae715c97e8088ef7fd39 (patch)
tree51848a1fd8ecb242b45236b11657c6d6c5eeb41e
downloadaur-0f87e031370fde6c63b7ae715c97e8088ef7fd39.tar.gz
0.0.11
-rw-r--r--.SRCINFO29
-rw-r--r--0.0.11.patch528
-rw-r--r--FindQwt.cmake81
-rw-r--r--PKGBUILD70
4 files changed, 708 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..5b1e29fd9cd5
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,29 @@
+pkgbase = ros-noetic-rqt-multiplot
+ pkgdesc = ROS - rqt_multiplot provides a GUI plugin for visualizing numeric values in multiple 2D plots using the Qwt plotting backend.
+ pkgver = 0.0.11
+ pkgrel = 1
+ url = https://wiki.ros.org/rqt_multiplot
+ arch = i686
+ arch = x86_64
+ arch = aarch64
+ arch = armv7h
+ arch = armv6h
+ license = BSD
+ makedepends = cmake
+ makedepends = ros-build-tools
+ makedepends = ros-noetic-catkin
+ depends = ros-noetic-rosbag
+ depends = ros-noetic-roscpp
+ depends = ros-noetic-rqt-gui
+ depends = ros-noetic-rqt-gui-cpp
+ depends = ros-noetic-variant-topic-tools
+ depends = qwt
+ depends = qt5-base
+ source = ros-noetic-rqt-multiplot-0.0.11.tar.gz::https://github.com/ANYbotics/rqt_multiplot_plugin/archive/0.0.11.tar.gz
+ source = FindQwt.cmake
+ source = 0.0.11.patch
+ sha256sums = 79f0abc3fc26b31dd9d5e6eb01f6cfb5058b425e774c6455513ffe3f76de74b4
+ sha256sums = SKIP
+ sha256sums = SKIP
+
+pkgname = ros-noetic-rqt-multiplot
diff --git a/0.0.11.patch b/0.0.11.patch
new file mode 100644
index 000000000000..f30d368c44af
--- /dev/null
+++ b/0.0.11.patch
@@ -0,0 +1,528 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index f7c230a..eeea6a6 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -2,7 +2,8 @@ cmake_minimum_required(VERSION 3.5.1)
+ project(rqt_multiplot)
+
+ # Set compiler flags
+-set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
++set(CMAKE_CXX_FLAGS "-std=c++17 ${CMAKE_CXX_FLAGS}")
++set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
+
+ find_package(catkin REQUIRED
+ COMPONENTS
+@@ -12,38 +13,8 @@ find_package(catkin REQUIRED
+ rqt_gui_cpp
+ variant_topic_tools
+ )
+-
+-if("${qt_gui_cpp_USE_QT_MAJOR_VERSION} " STREQUAL "5 ")
+- find_package(Qt5Widgets REQUIRED)
+-else()
+- find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
+- include(${QT_USE_FILE})
+-endif()
+-
+-find_path(
+- QWT_INCLUDE_DIRS
+- NAMES
+- qwt_plot.h
+- PATHS
+- /usr/include/qwt-qt4
+- /usr/include/qwt
+- /usr/local/include/qwt
+-)
+-
+-if("${qt_gui_cpp_USE_QT_MAJOR_VERSION} " STREQUAL "5 ")
+- find_library(
+- QWT_LIBRARIES
+- NAMES
+- qwt-qt5
+- )
+-else()
+- find_library(
+- QWT_LIBRARIES
+- NAMES
+- qwt-qt4
+- qwt
+- )
+-endif()
++find_package(Qwt REQUIRED)
++find_package(Qt5Widgets REQUIRED)
+
+ catkin_python_setup()
+
+diff --git a/include/rqt_multiplot/PlotZoomer.h b/include/rqt_multiplot/PlotZoomer.h
+index f83be0d..0e319ab 100644
+--- a/include/rqt_multiplot/PlotZoomer.h
++++ b/include/rqt_multiplot/PlotZoomer.h
+@@ -19,6 +19,7 @@
+ #ifndef RQT_MULTIPLOT_PLOT_ZOOMER_H
+ #define RQT_MULTIPLOT_PLOT_ZOOMER_H
+
++#include <QPoint>
+ #include <qwt/qwt_plot_zoomer.h>
+
+ class QwtPlotCanvas;
+diff --git a/src/rqt_multiplot/CurveData.cpp b/src/rqt_multiplot/CurveData.cpp
+index 1b7480c..88f27dc 100644
+--- a/src/rqt_multiplot/CurveData.cpp
++++ b/src/rqt_multiplot/CurveData.cpp
+@@ -17,6 +17,7 @@
+ ******************************************************************************/
+
+ #include "rqt_multiplot/CurveData.h"
++#include <cmath>
+
+ namespace rqt_multiplot {
+
+@@ -39,36 +40,36 @@ double CurveData::getValue(size_t index, CurveConfig::Axis axis) const {
+ return getPoint(index).x();
+ else if (axis == CurveConfig::Y)
+ return getPoint(index).y();
+-
++
+ return std::numeric_limits<double>::quiet_NaN();
+ }
+
+ QVector<size_t> CurveData::getPointsInDistance(double x, double maxDistance)
+ const {
+ QVector<size_t> indexes;
+-
++
+ if (!isEmpty()) {
+ for (size_t index = 0; index < getNumPoints(); ++index) {
+- double distance = fabs(x-getPoint(index).x());
+-
++ double distance = std::fabs(x-getPoint(index).x());
++
+ if (distance <= maxDistance)
+ indexes.append(index);
+ }
+ }
+-
++
+ return indexes;
+ }
+
+ QPair<double, double> CurveData::getAxisBounds(CurveConfig::Axis axis) const {
+ BoundingRectangle bounds = getBounds();
+-
++
+ if (axis == CurveConfig::X)
+ return QPair<double, double>(bounds.getMinimum().x(),
+ bounds.getMaximum().x());
+ else if (axis == CurveConfig::Y)
+ return QPair<double, double>(bounds.getMinimum().y(),
+ bounds.getMaximum().y());
+-
++
+ return QPair<double, double>();
+ }
+
+@@ -100,10 +101,10 @@ void CurveData::writeFormatted(QStringList& formattedX, QStringList&
+ formattedY) const {
+ formattedX.clear();
+ formattedY.clear();
+-
++
+ for (size_t index = 0; index < getNumPoints(); ++index) {
+ QPointF point = getPoint(index);
+-
++
+ formattedX.append(QString::number(point.x(), 'g', 20));
+ formattedY.append(QString::number(point.y(), 'g', 20));
+ }
+diff --git a/src/rqt_multiplot/CurveDataCircularBuffer.cpp b/src/rqt_multiplot/CurveDataCircularBuffer.cpp
+index f380b21..7674955 100644
+--- a/src/rqt_multiplot/CurveDataCircularBuffer.cpp
++++ b/src/rqt_multiplot/CurveDataCircularBuffer.cpp
+@@ -17,6 +17,7 @@
+ ******************************************************************************/
+
+ #include "rqt_multiplot/CurveDataCircularBuffer.h"
++#include <cmath>
+
+ namespace rqt_multiplot {
+
+@@ -49,34 +50,34 @@ size_t CurveDataCircularBuffer::getNumPoints() const {
+
+ QPointF CurveDataCircularBuffer::getPoint(size_t index) const {
+ const Point& point = points_[index];
+-
++
+ return QPointF(point.x_, point.y_);
+ }
+
+ QVector<size_t> CurveDataCircularBuffer::getPointsInDistance(double x,
+ double maxDistance) const {
+ QVector<size_t> indexes;
+-
++
+ XCoordinateRefMinHeap::ordered_iterator it = std::lower_bound(
+ xMin_.ordered_begin(), xMin_.ordered_end(), x-maxDistance);
+-
++
+ while (it != xMin_.ordered_end()) {
+- if (fabs(x-it->x_) <= maxDistance) {
++ if (std::fabs(x-it->x_) <= maxDistance) {
+ size_t index = it->index_;
+-
++
+ if (points_.array_two().second) {
+ index = (index < points_.array_two().second) ?
+ index+points_.array_one().second :
+ index-points_.array_two().second;
+ }
+-
++
+ indexes.push_back(index);
+ ++it;
+ }
+ else
+ break;
+ }
+-
++
+ return indexes;
+ }
+
+@@ -84,11 +85,11 @@ BoundingRectangle CurveDataCircularBuffer::getBounds() const {
+ if (!points_.empty()) {
+ QPointF minimum(xMin_.top().x_, yMin_.top());
+ QPointF maximum(xMax_.top(), yMax_.top());
+-
++
+ return BoundingRectangle(minimum, maximum);
+ }
+-
+-
++
++
+ return BoundingRectangle();
+ }
+
+@@ -99,13 +100,13 @@ BoundingRectangle CurveDataCircularBuffer::getBounds() const {
+ void CurveDataCircularBuffer::appendPoint(const QPointF& point) {
+ if (points_.full()) {
+ const Point& firstPoint = points_[0];
+-
++
+ xMin_.erase(firstPoint.xMinHandle_);
+ xMax_.erase(firstPoint.xMaxHandle_);
+ yMin_.erase(firstPoint.yMinHandle_);
+ yMax_.erase(firstPoint.yMaxHandle_);
+ }
+-
++
+ points_.push_back(point);
+ size_t index = points_.size()-1;
+
+@@ -113,16 +114,16 @@ void CurveDataCircularBuffer::appendPoint(const QPointF& point) {
+ index = (points_.array_one().first < points_.array_two().first) ?
+ &points_.back()-points_.array_one().first :
+ &points_.back()-points_.array_two().first;
+-
++
+ points_.back().xMinHandle_ = xMin_.push(XCoordinateRef(point.x(), index));
+ points_.back().xMaxHandle_ = xMax_.push(point.x());
+ points_.back().yMinHandle_ = yMin_.push(point.y());
+- points_.back().yMaxHandle_ = yMax_.push(point.y());
++ points_.back().yMaxHandle_ = yMax_.push(point.y());
+ }
+
+ void CurveDataCircularBuffer::clearPoints() {
+ points_.clear();
+-
++
+ xMin_.clear();
+ xMax_.clear();
+ yMin_.clear();
+diff --git a/src/rqt_multiplot/CurveDataVector.cpp b/src/rqt_multiplot/CurveDataVector.cpp
+index 17c86b1..099d733 100644
+--- a/src/rqt_multiplot/CurveDataVector.cpp
++++ b/src/rqt_multiplot/CurveDataVector.cpp
+@@ -17,6 +17,7 @@
+ ******************************************************************************/
+
+ #include "rqt_multiplot/CurveDataVector.h"
++#include <cmath>
+
+ namespace rqt_multiplot {
+
+@@ -45,18 +46,18 @@ QPointF CurveDataVector::getPoint(size_t index) const {
+ QVector<size_t> CurveDataVector::getPointsInDistance(double x, double
+ maxDistance) const {
+ QVector<size_t> indexes;
+-
++
+ XCoordinateRefSet::const_iterator it = x_.lower_bound(x-maxDistance);
+-
++
+ while (it != x_.end()) {
+- if (fabs(x-it->x_) <= maxDistance) {
++ if (std::fabs(x-it->x_) <= maxDistance) {
+ indexes.push_back(it->index_);
+ ++it;
+ }
+ else
+ break;
+ }
+-
++
+ return indexes;
+ }
+
+@@ -70,22 +71,22 @@ BoundingRectangle CurveDataVector::getBounds() const {
+
+ void CurveDataVector::appendPoint(const QPointF& point) {
+ bounds_ += point;
+-
++
+ if (points_.capacity() < points_.count()+1)
+ points_.reserve(points_.capacity() ? 2*points_.capacity() : 1);
+-
++
+ points_.append(point);
+-
++
+ if (x_.capacity() < x_.size()+1)
+ x_.reserve(x_.capacity() ? 2*x_.capacity() : 1);
+-
++
+ x_.insert(XCoordinateRef(point.x(), points_.size()-1));
+ }
+
+ void CurveDataVector::clearPoints() {
+ points_.clear();
+ x_.clear();
+-
++
+ bounds_.clear();
+ }
+
+diff --git a/src/rqt_multiplot/PlotCursor.cpp b/src/rqt_multiplot/PlotCursor.cpp
+index 0b9a7cf..c30c7f8 100644
+--- a/src/rqt_multiplot/PlotCursor.cpp
++++ b/src/rqt_multiplot/PlotCursor.cpp
+@@ -24,11 +24,13 @@
+ #include <QPainter>
+ #include <QPen>
+ #include <QResizeEvent>
++#include <QtMath>
+
+ #include <qwt/qwt_plot.h>
+ #include <qwt/qwt_plot_canvas.h>
+ #include <qwt/qwt_plot_curve.h>
+ #include <qwt/qwt_scale_widget.h>
++#include <qwt/qwt_scale_map.h>
+
+ #include <rqt_multiplot/CurveData.h>
+ #include <rqt_multiplot/PlotCursorMachine.h>
+diff --git a/src/rqt_multiplot/PlotCursorMachine.cpp b/src/rqt_multiplot/PlotCursorMachine.cpp
+index 0069463..97ef837 100644
+--- a/src/rqt_multiplot/PlotCursorMachine.cpp
++++ b/src/rqt_multiplot/PlotCursorMachine.cpp
+@@ -17,6 +17,7 @@
+ ******************************************************************************/
+
+ #include <QEvent>
++#include <QList>
+
+ #include "rqt_multiplot/PlotCursorMachine.h"
+
+diff --git a/src/rqt_multiplot/PlotCurve.cpp b/src/rqt_multiplot/PlotCurve.cpp
+index 68d65b1..84ac3bc 100644
+--- a/src/rqt_multiplot/PlotCurve.cpp
++++ b/src/rqt_multiplot/PlotCurve.cpp
+@@ -16,6 +16,7 @@
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. *
+ ******************************************************************************/
+
++#include <QPen>
+ #include <rqt_multiplot/CurveDataCircularBuffer.h>
+ #include <rqt_multiplot/CurveDataList.h>
+ #include <rqt_multiplot/CurveDataListTimeFrame.h>
+@@ -39,10 +40,10 @@ PlotCurve::PlotCurve(QObject* parent) :
+ dataSequencer_(new CurveDataSequencer(this)),
+ paused_(true) {
+ qRegisterMetaType<BoundingRectangle>("BoundingRectangle");
+-
+- connect(dataSequencer_, SIGNAL(pointReceived(const QPointF&)),
++
++ connect(dataSequencer_, SIGNAL(pointReceived(const QPointF&)),
+ this, SLOT(dataSequencerPointReceived(const QPointF&)));
+-
++
+ setData(data_);
+ }
+
+@@ -69,12 +70,12 @@ void PlotCurve::setConfig(CurveConfig* config) {
+ SLOT(configStyleConfigChanged()));
+ disconnect(config_->getDataConfig(), SIGNAL(changed()), this,
+ SLOT(configDataConfigChanged()));
+-
++
+ dataSequencer_->setConfig(0);
+ }
+-
++
+ config_ = config;
+-
++
+ if (config) {
+ connect(config, SIGNAL(titleChanged(const QString&)), this,
+ SLOT(configTitleChanged(const QString&)));
+@@ -89,14 +90,14 @@ void PlotCurve::setConfig(CurveConfig* config) {
+ SLOT(configStyleConfigChanged()));
+ connect(config->getDataConfig(), SIGNAL(changed()), this,
+ SLOT(configDataConfigChanged()));
+-
++
+ configTitleChanged(config->getTitle());
+ configAxisConfigChanged();
+ configColorConfigCurrentColorChanged(config->getColorConfig()->
+ getCurrentColor());
+ configStyleConfigChanged();
+ configDataConfigChanged();
+-
++
+ dataSequencer_->setConfig(config);
+ }
+ }
+@@ -109,7 +110,7 @@ CurveConfig* PlotCurve::getConfig() const {
+ void PlotCurve::setBroker(MessageBroker* broker) {
+ if (broker != broker_) {
+ broker_ = broker;
+-
++
+ dataSequencer_->setBroker(broker);
+ }
+ }
+@@ -129,11 +130,11 @@ CurveDataSequencer* PlotCurve::getDataSequencer() const {
+ QPair<double, double> PlotCurve::getPreferredAxisScale(CurveConfig::Axis axis)
+ const {
+ QPair<double, double> axisBounds(0.0, -1.0);
+-
++
+ if (config_) {
+ CurveAxisScaleConfig* axisScaleConfig = config_->getAxisConfig(axis)->
+ getScaleConfig();
+-
++
+ if (axisScaleConfig->getType() == CurveAxisScaleConfig::Absolute) {
+ axisBounds.first = axisScaleConfig->getAbsoluteMinimum();
+ axisBounds.second = axisScaleConfig->getAbsoluteMaximum();
+@@ -141,7 +142,7 @@ QPair<double, double> PlotCurve::getPreferredAxisScale(CurveConfig::Axis axis)
+ else if (axisScaleConfig->getType() == CurveAxisScaleConfig::Relative) {
+ if (!data_->isEmpty()) {
+ size_t index = data_->getNumPoints()-1;
+-
++
+ axisBounds.first = data_->getValue(index, axis)+axisScaleConfig->
+ getRelativeMinimum();
+ axisBounds.second = data_->getValue(index, axis)+axisScaleConfig->
+@@ -151,7 +152,7 @@ QPair<double, double> PlotCurve::getPreferredAxisScale(CurveConfig::Axis axis)
+ else
+ axisBounds = data_->getAxisBounds(axis);
+ }
+-
++
+ return axisBounds;
+ }
+
+@@ -200,7 +201,7 @@ void PlotCurve::pause() {
+
+ void PlotCurve::clear() {
+ data_->clearPoints();
+-
++
+ emit replotRequested();
+ }
+
+@@ -218,25 +219,25 @@ void PlotCurve::configAxisConfigChanged() {
+
+ void PlotCurve::configColorConfigCurrentColorChanged(const QColor& color) {
+ setPen(color);
+-
++
+ emit replotRequested();
+ }
+
+ void PlotCurve::configStyleConfigChanged() {
+ rqt_multiplot::CurveStyleConfig* styleConfig = config_->getStyleConfig();
+-
++
+ if (styleConfig->getType() == rqt_multiplot::CurveStyleConfig::Sticks) {
+ setStyle(QwtPlotCurve::Sticks);
+-
++
+ setOrientation(styleConfig->getSticksOrientation());
+ setBaseline(styleConfig->getSticksBaseline());
+ }
+ else if (styleConfig->getType() == rqt_multiplot::CurveStyleConfig::
+ Steps) {
+ setStyle(QwtPlotCurve::Steps);
+-
++
+ setCurveAttribute(QwtPlotCurve::Inverted, styleConfig->
+- areStepsInverted());
++ areStepsInverted());
+ }
+ else if (styleConfig->getType() == rqt_multiplot::CurveStyleConfig::
+ Points) {
+@@ -244,21 +245,21 @@ void PlotCurve::configStyleConfigChanged() {
+ }
+ else {
+ setStyle(QwtPlotCurve::Lines);
+-
++
+ setCurveAttribute(QwtPlotCurve::Fitted, styleConfig->
+- areLinesInterpolated());
++ areLinesInterpolated());
+ }
+-
++
+ QPen pen = QwtPlotCurve::pen();
+
+ pen.setWidth(styleConfig->getPenWidth());
+ pen.setStyle(styleConfig->getPenStyle());
+-
++
+ setPen(pen);
+-
++
+ setRenderHint(QwtPlotItem::RenderAntialiased, styleConfig->
+ isRenderAntialiased());
+-
++
+ emit replotRequested();
+ }
+
+@@ -273,20 +274,20 @@ void PlotCurve::configDataConfigChanged() {
+ data_ = new CurveDataListTimeFrame(config->getTimeFrameLength());
+ else
+ data_ = new CurveDataVector();
+-
++
+ setData(data_);
+-
++
+ emit replotRequested();
+ }
+
+ void PlotCurve::dataSequencerPointReceived(const QPointF& point) {
+ if (!paused_) {
+ BoundingRectangle oldBounds = getPreferredScale();
+-
++
+ data_->appendPoint(point);
+-
++
+ BoundingRectangle bounds = getPreferredScale();
+-
++
+ if (bounds != oldBounds)
+ emit preferredScaleChanged(bounds);
+
diff --git a/FindQwt.cmake b/FindQwt.cmake
new file mode 100644
index 000000000000..aeeff0a62bae
--- /dev/null
+++ b/FindQwt.cmake
@@ -0,0 +1,81 @@
+# - try to find Qwt libraries and include files
+# QWT_INCLUDE_DIR where to find qwt_global.h, etc.
+# QWT_LIBRARIES libraries to link against
+# QWT_FOUND If false, do not try to use Qwt
+# qwt_global.h holds a string with the QWT version;
+# test to make sure it's at least 5.2
+FIND_PACKAGE(PkgConfig REQUIRED)
+pkg_check_modules(PC_QWT "Qt5Qwt6")
+set(QWT_QT_VERSION qt5)
+find_path(QWT_INCLUDE_DIRS
+ NAMES qwt_global.h
+ HINTS
+ ${PC_QWT_INCLUDEDIR}
+ ${CMAKE_INSTALL_PREFIX}/include/qwt
+ ${CMAKE_PREFIX_PATH}/include/qwt
+ PATHS
+ /usr/local/include/qwt-${QWT_QT_VERSION}
+ /usr/local/include/qwt
+ /usr/include/qwt6
+ /usr/include/qt5/qwt
+ /usr/include/qwt-${QWT_QT_VERSION}
+ /usr/include/qwt
+ /usr/include/${QWT_QT_VERSION}/qwt
+ /usr/include/qwt5
+ /opt/local/include/qwt
+ /sw/include/qwt
+ /usr/local/lib/qwt.framework/Headers
+)
+
+find_library(QWT_LIBRARIES
+ NAMES ${PC_QWT_LIBRARIES} qwt6-${QWT_QT_VERSION} qwt-${QWT_QT_VERSION} qwt5 libqwt5.so
+ HINTS
+ ${PC_QWT_LIBDIR}
+ ${CMAKE_INSTALL_PREFIX}/lib
+ ${CMAKE_INSTALL_PREFIX}/lib64
+ ${CMAKE_PREFIX_PATH}/lib
+ PATHS
+ /usr/local/lib
+ /usr/lib
+ /opt/local/lib
+ /sw/lib
+ /usr/local/lib/qwt.framework
+)
+
+set(QWT_FOUND FALSE)
+
+if(QWT_INCLUDE_DIRS)
+ file(STRINGS "${QWT_INCLUDE_DIRS}/qwt_global.h"
+ QWT_STRING_VERSION REGEX "QWT_VERSION_STR")
+ set(QWT_WRONG_VERSION True)
+ set(QWT_VERSION "No Version")
+ string(REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" QWT_VERSION ${QWT_STRING_VERSION})
+ string(COMPARE LESS ${QWT_VERSION} "5.2.0" QWT_WRONG_VERSION)
+ string(COMPARE GREATER ${QWT_VERSION} "6.2.0" QWT_WRONG_VERSION)
+
+ message(STATUS "QWT Version: ${QWT_VERSION}")
+
+ if(NOT QWT_WRONG_VERSION)
+ set(QWT_FOUND TRUE)
+ else(NOT QWT_WRONG_VERSION)
+ message(STATUS "QWT Version must be >= 5.2 and <= 6.2.0, Found ${QWT_VERSION}")
+ endif(NOT QWT_WRONG_VERSION)
+endif(QWT_INCLUDE_DIRS)
+
+if(QWT_FOUND)
+ message("qwt: found")
+
+ # handle the QUIETLY and REQUIRED arguments and set QWT_FOUND to TRUE if
+ # all listed variables are TRUE
+ include(FindPackageHandleStandardArgs)
+ find_package_handle_standard_args(Qwt DEFAULT_MSG QWT_LIBRARIES QWT_INCLUDE_DIRS)
+ MARK_AS_ADVANCED(QWT_LIBRARIES QWT_INCLUDE_DIRS)
+
+ if(Qwt_FOUND AND NOT TARGET qwt::qwt)
+ add_library(qwt::qwt INTERFACE IMPORTED)
+ set_target_properties(qwt::qwt PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${QWT_INCLUDE_DIRS}"
+ INTERFACE_LINK_LIBRARIES "${QWT_LIBRARIES}"
+ )
+ endif()
+endif(QWT_FOUND)
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..8e4f3ebea0f1
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,70 @@
+pkgdesc="ROS - rqt_multiplot provides a GUI plugin for visualizing numeric values in multiple 2D plots using the Qwt plotting backend."
+url="https://wiki.ros.org/rqt_multiplot"
+
+pkgname=ros-noetic-rqt-multiplot
+pkgver='0.0.11'
+pkgrel=1
+arch=('i686' 'x86_64' 'aarch64' 'armv7h' 'armv6h')
+license=('BSD')
+
+ros_makedepends=(
+ ros-noetic-catkin
+)
+
+makedepends=(
+ cmake
+ ros-build-tools
+ ${ros_makedepends[@]}
+)
+
+ros_depends=(
+ ros-noetic-rosbag
+ ros-noetic-roscpp
+ ros-noetic-rqt-gui
+ ros-noetic-rqt-gui-cpp
+ ros-noetic-variant-topic-tools
+)
+
+depends=(
+ ${ros_depends[@]}
+ qwt
+ qt5-base
+)
+
+_dir="rqt_multiplot_plugin-${pkgver}"
+source=(
+ "${pkgname}-${pkgver}.tar.gz::https://github.com/ANYbotics/rqt_multiplot_plugin/archive/${pkgver}.tar.gz"
+ "FindQwt.cmake"
+ "0.0.11.patch"
+)
+sha256sums=('79f0abc3fc26b31dd9d5e6eb01f6cfb5058b425e774c6455513ffe3f76de74b4' 'SKIP' 'SKIP')
+
+prepare() {
+ [ -d ${srcdir}/${_dir}/cmake ] || mkdir ${srcdir}/${_dir}/cmake
+ cp ${srcdir}/FindQwt.cmake ${srcdir}/${_dir}/cmake/
+ cd ${srcdir}/${_dir}
+ patch -Np1 -i ${srcdir}/0.0.11.patch
+}
+
+build() {
+ # Use ROS environment variables
+ source /usr/share/ros-build-tools/clear-ros-env.sh
+ [ -f /opt/ros/noetic/setup.bash ] && source /opt/ros/noetic/setup.bash
+
+ # Create build directory
+ [ -d ${srcdir}/build ] || mkdir ${srcdir}/build
+ cd ${srcdir}/build
+
+ # Build project
+ cmake ${srcdir}/${_dir} \
+ -DCATKIN_BUILD_BINARY_PACKAGE=ON \
+ -DCMAKE_INSTALL_PREFIX=/opt/ros/noetic \
+ -DPYTHON_EXECUTABLE=/usr/bin/python \
+ -DSETUPTOOLS_DEB_LAYOUT=OFF
+ make
+}
+
+package() {
+ cd "${srcdir}/build"
+ make DESTDIR="${pkgdir}/" install
+}