cabana/chart: use different colors to distinguish similar signals (#29890)

* Use different colors to distinguish similar signals

* check hueF value

* lighter
pull/29900/head
Dean Lee 2 years ago committed by GitHub
parent 748eb4a7c7
commit 34f5cad4e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 23
      tools/cabana/chart/chart.cc
  2. 1
      tools/cabana/chart/chart.h
  3. 4
      tools/cabana/chart/chartswidget.cc

@ -14,6 +14,7 @@
#include <QMimeData> #include <QMimeData>
#include <QOpenGLWidget> #include <QOpenGLWidget>
#include <QPropertyAnimation> #include <QPropertyAnimation>
#include <QRandomGenerator>
#include <QRubberBand> #include <QRubberBand>
#include <QScreen> #include <QScreen>
#include <QtMath> #include <QtMath>
@ -151,6 +152,11 @@ void ChartView::removeIf(std::function<bool(const SigItem &s)> predicate) {
void ChartView::signalUpdated(const cabana::Signal *sig) { void ChartView::signalUpdated(const cabana::Signal *sig) {
if (std::any_of(sigs.cbegin(), sigs.cend(), [=](auto &s) { return s.sig == sig; })) { if (std::any_of(sigs.cbegin(), sigs.cend(), [=](auto &s) { return s.sig == sig; })) {
for (const auto &s : sigs) {
if (s.sig == sig && s.series->color() != sig->color) {
setSeriesColor(s.series, sig->color);
}
}
updateTitle(); updateTitle();
updateSeries(sig); updateSeries(sig);
} }
@ -281,7 +287,6 @@ void ChartView::updateSeries(const cabana::Signal *sig, bool clear) {
s.step_vals.clear(); s.step_vals.clear();
s.last_value_mono_time = 0; s.last_value_mono_time = 0;
} }
s.series->setColor(s.sig->color);
const auto &msgs = can->events(s.msg_id); const auto &msgs = can->events(s.msg_id);
s.vals.reserve(msgs.capacity()); s.vals.reserve(msgs.capacity());
@ -789,6 +794,7 @@ QXYSeries *ChartView::createSeries(SeriesType type, QColor color) {
} }
void ChartView::addSeries(QXYSeries *series) { void ChartView::addSeries(QXYSeries *series) {
setSeriesColor(series, series->color());
chart()->addSeries(series); chart()->addSeries(series);
series->attachAxis(axis_x); series->attachAxis(axis_x);
series->attachAxis(axis_y); series->attachAxis(axis_y);
@ -801,6 +807,21 @@ void ChartView::addSeries(QXYSeries *series) {
} }
} }
void ChartView::setSeriesColor(QXYSeries *series, QColor color) {
auto existing_series = chart()->series();
for (auto s : existing_series) {
if (s != series && std::abs(color.hueF() - qobject_cast<QXYSeries *>(s)->color().hueF()) < 0.1) {
// use different color to distinguish it from others.
auto last_color = qobject_cast<QXYSeries *>(existing_series.back())->color();
color.setHsvF(std::fmod(last_color.hueF() + 60 / 360.0, 1.0),
QRandomGenerator::global()->bounded(35, 100) / 100.0,
QRandomGenerator::global()->bounded(85, 100) / 100.0);
break;
}
}
series->setColor(color);
}
void ChartView::setSeriesType(SeriesType type) { void ChartView::setSeriesType(SeriesType type) {
if (type != series_type) { if (type != series_type) {
series_type = type; series_type = type;

@ -89,6 +89,7 @@ private:
std::tuple<double, double, int> getNiceAxisNumbers(qreal min, qreal max, int tick_count); std::tuple<double, double, int> getNiceAxisNumbers(qreal min, qreal max, int tick_count);
qreal niceNumber(qreal x, bool ceiling); qreal niceNumber(qreal x, bool ceiling);
QXYSeries *createSeries(SeriesType type, QColor color); QXYSeries *createSeries(SeriesType type, QColor color);
void setSeriesColor(QXYSeries *, QColor color);
void updateSeriesPoints(); void updateSeriesPoints();
void removeIf(std::function<bool(const SigItem &)> predicate); void removeIf(std::function<bool(const SigItem &)> predicate);
inline void clearTrackPoints() { for (auto &s : sigs) s.track_pt = {}; } inline void clearTrackPoints() { for (auto &s : sigs) s.track_pt = {}; }

@ -277,6 +277,10 @@ void ChartsWidget::splitChart(ChartView *src_chart) {
for (auto it = src_chart->sigs.begin() + 1; it != src_chart->sigs.end(); /**/) { for (auto it = src_chart->sigs.begin() + 1; it != src_chart->sigs.end(); /**/) {
auto c = createChart(); auto c = createChart();
src_chart->chart()->removeSeries(it->series); src_chart->chart()->removeSeries(it->series);
// Restore to the original color
it->series->setColor(it->sig->color);
c->addSeries(it->series); c->addSeries(it->series);
c->sigs.push_back(*it); c->sigs.push_back(*it);
c->updateAxisY(); c->updateAxisY();

Loading…
Cancel
Save