diff --git a/chart_plugin/src/common/chart_display_base.h b/chart_plugin/src/common/chart_display_base.h index 580939ee1824ca6154b0fa6ddbe5dd81a751a88c..8a971f74438cce6b00247ef2e9bfb059582e5754 100755 --- a/chart_plugin/src/common/chart_display_base.h +++ b/chart_plugin/src/common/chart_display_base.h @@ -113,6 +113,7 @@ protected: const uint32_t queueSize = 10; sub.subscribe(update_nh_, topic_property_->getTopicStd(), queueSize, transportHint); setStatus(rviz::StatusProperty::Ok, "Topic", "OK"); + setStatus(rviz::StatusProperty::Warn, "Data receiving failure", "No Display data was received in the last 1 second."); } catch (ros::Exception &e) { setStatus(rviz::StatusProperty::Error, "Topic", QString("Error subscribing: ") + e.what()); } @@ -142,6 +143,7 @@ protected: ++messagesReceived; setStatus(rviz::StatusProperty::Ok, "Topic", QString::number(messagesReceived) + " messages received"); + deleteStatus("Data receiving failure"); ProcessMessage(msg); } diff --git a/chart_plugin/src/curve_display.cpp b/chart_plugin/src/curve_display.cpp index 55597ff578443a74304ffa044221a5f78cabd3b1..e9b0fb7ae14fba83a51ce0506b4c65b5af7d498f 100755 --- a/chart_plugin/src/curve_display.cpp +++ b/chart_plugin/src/curve_display.cpp @@ -31,6 +31,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include "common/utils.h" @@ -79,6 +80,10 @@ const double QWTPLOT_AXIS_XBOTTOM_MAX = 0x96; const double QWTPLOT_AXIS_YLEFT_MIN = 0x00; const double QWTPLOT_AXIS_YLEFT_MAX = 0x0A; +const int32_t LEGEND_WIDGETS_SIZE = 0x01; + +const QString LEGEND_STYLE_SHEET = "color: rgb(255, 255, 255)"; + enum CurveType { FIRST_CURVE, SECOND_CURVE, @@ -208,6 +213,23 @@ const QString CurveDisplay::StringElidedText(const QFont &font, const QString &t return strText; } +void CurveDisplay::ShowCurve(QwtPlotItem *item, bool isVisible) +{ + if (item == nullptr) { + return; + } + + item->setVisible(isVisible); + QwtLegend *legend = qobject_cast(ui.qwtPlot->legend()); + QList legendWidgets = legend->legendWidgets(ui.qwtPlot->itemToInfo(item)); + if (legendWidgets.size() == LEGEND_WIDGETS_SIZE) { + QwtLegendLabel *legendLabel = qobject_cast(legendWidgets[0]); + if (legendLabel != nullptr) { + legendLabel->setChecked(isVisible); + } + } +} + void CurveDisplay::UpdateXAxisTitle() { QwtScaleWidget *scaleWidget = ui.qwtPlot->axisWidget(QwtPlot::xBottom); @@ -279,7 +301,18 @@ void CurveDisplay::InitQwtPlotStyle() // 设置图例的位置 QwtLegend *legend = new QwtLegend(); - ui.qwtPlot->insertLegend(legend, QwtPlot::BottomLegend); + if (legend != nullptr) { + legend->setStyleSheet(LEGEND_STYLE_SHEET); + legend->setDefaultItemMode(QwtLegendData::Checkable); + ui.qwtPlot->insertLegend(legend, QwtPlot::BottomLegend); + connect(legend, &QwtLegend::checked, this, [=](const QVariant &itemInfo, bool isVisible, int){ + QwtPlotItem *plotItem = ui.qwtPlot->infoToItem(itemInfo); + if (plotItem != nullptr) { + plotItem->setVisible(isVisible); + } + ui.qwtPlot->replot(); + }); + } // 绘制网格 grid.setPen(QColor(QWTPLOT_GRID_COLOR_R, QWTPLOT_GRID_COLOR_G, QWTPLOT_GRID_COLOR_B), QWTPLOT_GRID_PEN_WIDTH); @@ -348,10 +381,12 @@ void CurveDisplay::onInitialize() InitCurveStyle(firstCurve, *firstCurveTitleProperty, *firstCurveColorProperty, *firstCurveAlphaProperty); // 添加到控件上 firstCurve.attach(ui.qwtPlot); + ShowCurve(&firstCurve, true); InitCurveStyle(secondCurve, *secondCurveTitleProperty, *secondCurveColorProperty, *secondCurveAlphaProperty); // 添加到控件上 secondCurve.attach(ui.qwtPlot); + ShowCurve(&secondCurve, true); setAssociatedWidget(&widget); UpdateCurveChoice(); diff --git a/chart_plugin/src/curve_display.h b/chart_plugin/src/curve_display.h index 800b132471e99a5f4828f11c3e2a3030e5d652c5..994517c501b72676c28d52e0ac17321711c04246 100755 --- a/chart_plugin/src/curve_display.h +++ b/chart_plugin/src/curve_display.h @@ -220,6 +220,14 @@ private: */ const QString StringElidedText(const QFont &font, const QString &text, const int32_t displayAreaWidth); + /* + * 功能:控制当前曲线是否显示 + * 输入参数:item-当时被控制的曲线,isVisible-控制显隐 + * 输出参数:无 + * 返回值:无 + */ + void ShowCurve(QwtPlotItem *item, bool isVisible); + private: UiCurveWidget ui {}; QWidget widget {}; diff --git a/chart_plugin/src/slt_space/slt_space_data.cpp b/chart_plugin/src/slt_space/slt_space_data.cpp index c31a16390a7ba914e69cb6d6cbb173552f71b1bf..e7e49e83d2741cfdd19b0e744226fafbe3fb0e4d 100755 --- a/chart_plugin/src/slt_space/slt_space_data.cpp +++ b/chart_plugin/src/slt_space/slt_space_data.cpp @@ -62,17 +62,30 @@ void SltSpaceData::SetObjectsFaceData(const vector &pointVecto { objectsMap.clear(); objectsIdTypeMap.clear(); + objectsTypeIdMap.clear(); if (pointVector.empty()) { return; } + QStringList listId; for (const auto &point : pointVector) { int32_t type = point.type; QString id = QString::fromStdString(point.id); + listId.push_back(id); + if (!QueueHaveId(id)) { + LimitQueueNumber(listId); + objectsIdVisibleQueue.enqueue(QPair(id, true)); + } + if (!objectsMap.contains(id)) { objectsMap.insert(id, CreateObjectIdData(point)); objectsIdTypeMap.insert(id, type); + QStringList listId = objectsTypeIdMap.value(type); + if (!listId.contains(id)) { + listId.push_back(id); + } + objectsTypeIdMap[type] = listId; continue; } objectsMap[id].push_back(mglPoint(point.sValue, point.lValue, point.tValue)); @@ -99,12 +112,42 @@ const QMap &SltSpaceData::GetObjectsIdTypeMap() const return objectsIdTypeMap; } +const QMap &SltSpaceData::GetObjectsTypeIdMap() const +{ + return objectsTypeIdMap; +} + +void SltSpaceData::SetObjectVisible(const QString &id, bool isVisible) +{ + for (auto iter = objectsIdVisibleQueue.begin(); iter != objectsIdVisibleQueue.end(); iter++) { + if (iter->first == id) { + iter->second = isVisible; + return; + } + } + + objectsIdVisibleQueue.enqueue(QPair(id, isVisible)); +} + +bool SltSpaceData::GetObjectVisible(const QString &id) const +{ + for (auto pair : objectsIdVisibleQueue) { + if (pair.first == id) { + return pair.second; + } + } + return true; +} + void SltSpaceData::Clear() { + objectsIdVisibleQueue.clear(); + optimizedSltTrack.clear(); sltSpeedLimit.clear(); objectsMap.clear(); objectsIdTypeMap.clear(); + objectsTypeIdMap.clear(); } bool SltSpaceData::Add(const custom::SltSpace::ConstPtr &msg) @@ -123,4 +166,29 @@ bool SltSpaceData::Add(const custom::SltSpace::ConstPtr &msg) } return false; } + +bool SltSpaceData::QueueHaveId(const QString &id) +{ + for (auto iter = objectsIdVisibleQueue.begin(); iter != objectsIdVisibleQueue.end(); iter++) { + if (iter->first == id) { + return true; + } + } + return false; +} + +void SltSpaceData::LimitQueueNumber(const QStringList &listId) +{ + int32_t queueMaxNumber = 1000; + if (objectsIdVisibleQueue.count() < queueMaxNumber) { + return; + } + + for (auto iter = objectsIdVisibleQueue.begin(); iter != objectsIdVisibleQueue.end(); iter++) { + if (!listId.contains(iter->first)) { + objectsIdVisibleQueue.erase(iter); + return; + } + } +} } // namespace chart_plugin diff --git a/chart_plugin/src/slt_space/slt_space_data.h b/chart_plugin/src/slt_space/slt_space_data.h index 37d8ce601ccc2bca7b3794465dba8d9b5b495020..214bcaa975beea800f869924b14456eede55d13d 100755 --- a/chart_plugin/src/slt_space/slt_space_data.h +++ b/chart_plugin/src/slt_space/slt_space_data.h @@ -28,6 +28,8 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SLT_SPACE_DATA_H #include +#include +#include #include #include "custom/SltSpace.h" @@ -86,7 +88,31 @@ public: * 返回值:QMap障碍物属性数据,障碍物id和其对应type信息 */ const QMap &GetObjectsIdTypeMap() const; + + /* + * 功能:获取障碍物属性数据 + * 输入参数:无 + * 输出参数:无 + * 返回值:QMap障碍物属性数据,障碍物type和其对应多个id + */ + const QMap &GetObjectsTypeIdMap() const; + /* + * 功能:设置障碍物是否显示 + * 输入参数:id-障碍物id属性,isVisible-障碍物显隐 + * 输出参数:无 + * 返回值:无 + */ + void SetObjectVisible(const QString &id, bool isVisible); + + /* + * 功能:获取障碍物是否显示 + * 输入参数:id-障碍物id属性 + * 输出参数:无 + * 返回值:障碍物是否显示 + */ + bool GetObjectVisible(const QString &id) const; + private: /* * 功能:设置曲线 mglPoint 数据信息 @@ -112,12 +138,31 @@ private: */ std::vector CreateObjectIdData(const custom::SltPoint &point); + /* + * 功能:查询objectsIdVisibleQueue队列是否有id数据 + * 输入参数:id-障碍物id属性 + * 输出参数:无 + * 返回值:无 + */ + bool QueueHaveId(const QString &id); + + /* + * 功能:设置objectsIdVisibleQueue队列上限 + * 输入参数:listId-障碍物链表 + * 输出参数:无 + * 返回值:无 + */ + void LimitQueueNumber(const QStringList &listId); + private: std::vector optimizedSltTrack {}; std::vector sltSpeedLimit {}; QMap> objectsMap {}; QMap objectsIdTypeMap {}; + QMap objectsTypeIdMap {}; + + QQueue> objectsIdVisibleQueue {}; }; } // namespace chart_plugin diff --git a/chart_plugin/src/slt_space/slt_space_draw.cpp b/chart_plugin/src/slt_space/slt_space_draw.cpp index 4d372ef0c8ffa6a211feeb4850f7294851a3527c..99839d45d0f8f3bba2829aa3086bf75a93c9f76f 100755 --- a/chart_plugin/src/slt_space/slt_space_draw.cpp +++ b/chart_plugin/src/slt_space/slt_space_draw.cpp @@ -108,46 +108,45 @@ void SltSpaceDraw::DrawObjects(mglGraph *mglGraphPtr) const const auto sltObjectsMap = spaceDataPtr->GetObjectsMap(); const auto objectsIdType = spaceDataPtr->GetObjectsIdTypeMap(); - QList listType = objectsIdType.values(); - qSort(listType.begin(), listType.end()); - - for (auto type : listType) { - vector objectData = sltObjectsMap.value(objectsIdType.key(type)); - if (objectData.size() != OBJECT_DATA_NUM_SIZE) { - continue; - } - QString objectId = objectsIdType.key(type); - spaceDisplayPtr->SetObjectProperty(type); - auto objectIdLegendIter = (spaceDisplayPtr->GetObjectsIdLegendMap()).find(objectId); - if (objectIdLegendIter != (spaceDisplayPtr->GetObjectsIdLegendMap()).end() && - !((*objectIdLegendIter).second)->isChecked()) { - continue; - } - - auto objectsTypeColorPropertyMap = spaceDisplayPtr->GetObjectsTypeColorPropertyMap(); - if (!objectsTypeColorPropertyMap.contains(type) || objectsTypeColorPropertyMap[type] == nullptr) { - continue; - } - QColor color = objectsTypeColorPropertyMap[type]->getColor(); - QString colorFaceFormat = COLOR_FACE_PREFIX + color.name().mid(0x1) + COLOR_FACE_SUFFIX; - mglGraphPtr->Face(objectData[OBJECT_DATA_NUM0], objectData[OBJECT_DATA_NUM1], objectData[OBJECT_DATA_NUM3], + const auto objectsTypeId = spaceDataPtr->GetObjectsTypeIdMap(); + + for (auto iter = objectsTypeId.begin(); iter != objectsTypeId.end(); iter++) { + int32_t objectType = iter.key(); + QStringList listId = iter.value(); + qSort(listId.begin(), listId.end()); + for (auto objectId : listId) { + vector objectData = sltObjectsMap.value(objectId); + if (objectData.size() != OBJECT_DATA_NUM_SIZE) { + continue; + } + spaceDisplayPtr->SetObjectProperty(objectType); + if (!spaceDataPtr->GetObjectVisible(objectId)) { + continue; + } + + QColor color = (spaceDisplayPtr->GetObjectsTypeColorPropertyMap())[objectType]->getColor(); + QString colorFaceFormat = COLOR_FACE_PREFIX + color.name().mid(0x1) + COLOR_FACE_SUFFIX; + mglGraphPtr->Face(objectData[OBJECT_DATA_NUM0], objectData[OBJECT_DATA_NUM1], objectData[OBJECT_DATA_NUM3], objectData[OBJECT_DATA_NUM2], colorFaceFormat.toStdString().c_str()); - mglGraphPtr->Face(objectData[OBJECT_DATA_NUM2], objectData[OBJECT_DATA_NUM3], objectData[OBJECT_DATA_NUM6], + mglGraphPtr->Face(objectData[OBJECT_DATA_NUM2], objectData[OBJECT_DATA_NUM3], objectData[OBJECT_DATA_NUM6], objectData[OBJECT_DATA_NUM7], colorFaceFormat.toStdString().c_str()); - mglGraphPtr->Face(objectData[OBJECT_DATA_NUM6], objectData[OBJECT_DATA_NUM7], objectData[OBJECT_DATA_NUM5], + mglGraphPtr->Face(objectData[OBJECT_DATA_NUM6], objectData[OBJECT_DATA_NUM7], objectData[OBJECT_DATA_NUM5], objectData[OBJECT_DATA_NUM4], colorFaceFormat.toStdString().c_str()); - mglGraphPtr->Face(objectData[OBJECT_DATA_NUM0], objectData[OBJECT_DATA_NUM1], objectData[OBJECT_DATA_NUM4], + mglGraphPtr->Face(objectData[OBJECT_DATA_NUM0], objectData[OBJECT_DATA_NUM1], objectData[OBJECT_DATA_NUM4], objectData[OBJECT_DATA_NUM5], colorFaceFormat.toStdString().c_str()); - mglGraphPtr->Face(objectData[OBJECT_DATA_NUM1], objectData[OBJECT_DATA_NUM2], objectData[OBJECT_DATA_NUM5], + mglGraphPtr->Face(objectData[OBJECT_DATA_NUM1], objectData[OBJECT_DATA_NUM2], objectData[OBJECT_DATA_NUM5], objectData[OBJECT_DATA_NUM6], colorFaceFormat.toStdString().c_str()); - mglGraphPtr->Face(objectData[OBJECT_DATA_NUM0], objectData[OBJECT_DATA_NUM3], objectData[OBJECT_DATA_NUM4], + mglGraphPtr->Face(objectData[OBJECT_DATA_NUM0], objectData[OBJECT_DATA_NUM3], objectData[ OBJECT_DATA_NUM4], objectData[OBJECT_DATA_NUM7], colorFaceFormat.toStdString().c_str()); + } } if (spaceDisplayPtr->GetIsTopicMessageComing()) { spaceDisplayPtr->SetIsTopicMessageComing(false); spaceDisplayPtr->CreateObjectsLegend(objectsIdType); spaceDisplayPtr->UpdateLegend(); + } else { + spaceDisplayPtr->UpdateLegend(); } } diff --git a/chart_plugin/src/slt_space_display.cpp b/chart_plugin/src/slt_space_display.cpp index ee930e5515ffe8016a3340c1ff1d9d19269c587a..4a4362b9ec2fa06e0eeaafc417ccd6f5d8d8df2c 100755 --- a/chart_plugin/src/slt_space_display.cpp +++ b/chart_plugin/src/slt_space_display.cpp @@ -70,6 +70,8 @@ bool SltSpaceDisplay::eventFilter(QObject *obj, QEvent *e) void SltSpaceDisplay::ClearData() { + optimizedCurveLegend->setChecked(true); + speedLimitCurveLegend->setChecked(true); sltSpaceData.Clear(); } @@ -322,6 +324,10 @@ const QIcon SltSpaceDisplay::GenerateLegendIcon(const QColor &color, LegendType void SltSpaceDisplay::CreateObjectsLegend(const QMap &objectsIdType) { + if (!objectsIdLegendMap.empty()) { + objectsIdLegendMap.clear(); + } + for (auto iter = objectsIdType.begin(); iter != objectsIdType.end(); iter++) { QString objectId = iter.key(); int32_t objectType = iter.value(); @@ -342,7 +348,7 @@ void SltSpaceDisplay::CreateObjectsLegend(const QMap &objectsI QString("%1: %2").arg(objectsTypeTitlePropertyMap[objectType]->getString()).arg(objectId)); QObject::connect(buttonLegend.get(), SIGNAL(toggled(bool)), this, SLOT(UpdateMathglDraw())); objectsIdLegendMap.insert(std::make_pair(objectId, std::move(buttonLegend))); - objectsIdLegendMap[objectId]->setChecked(true); + objectsIdLegendMap[objectId]->setChecked(sltSpaceData.GetObjectVisible(objectId)); } } @@ -432,10 +438,16 @@ void SltSpaceDisplay::UpdateGridLayoutItem() ui.GetGridLayout()->addItem(horizontalSpacerLeft, 1, 0, 1, 1); ui.GetGridLayout()->addItem(horizontalSpacerRight, 1, column - 1, 1, 1); - const auto &objectsIdTypeMap = sltSpaceData.GetObjectsIdTypeMap(); - - QList listType = objectsIdTypeMap.values(); - qSort(listType.begin(), listType.end()); + const auto &objectsTypeIdMap = sltSpaceData.GetObjectsTypeIdMap(); + + QList listType = objectsTypeIdMap.keys(); + + QStringList listId; + for (auto type : listType) { + QStringList listObjectId = objectsTypeIdMap.value(type); + qSort(listObjectId.begin(), listObjectId.end()); + listId << listObjectId; + } int32_t k = 0; // 从第1行第1列位置开始放置图例按钮,遍历网格图例按钮放置区域(row - 2)行乘(column - 2)列个放置空间 @@ -450,14 +462,16 @@ void SltSpaceDisplay::UpdateGridLayoutItem() ui.GetGridLayout()->addWidget(speedLimitCurveLegend, i, j, 1, 1); speedLimitCurveLegend->show(); // 只有当整个障碍物图例按钮都还没有遍历安置完毕,网格布局器才安置图例按钮 - } else if (k < listType.count()) { - auto objectIdLegendIter = objectsIdLegendMap.find(objectsIdTypeMap.key(listType.at(k))); + } else if (k < listId.count()) { + QString objectId = listId.at(k); + + auto objectIdLegendIter = objectsIdLegendMap.find(objectId); if ((objectIdLegendIter == objectsIdLegendMap.end()) || (objectIdLegendIter->second == nullptr)) { k++; continue; } - ui.GetGridLayout()->addWidget(objectsIdLegendMap[objectsIdTypeMap.key(listType.at(k))].get(), i, j, 1, 1); - objectsIdLegendMap[objectsIdTypeMap.key(listType.at(k))]->show(); + ui.GetGridLayout()->addWidget(objectsIdLegendMap[objectId].get(), i, j, 1, 1); + objectsIdLegendMap[objectId]->show(); k++; } } @@ -546,8 +560,17 @@ void SltSpaceDisplay::onInitialize() QObject::connect(ui.GetRestoreButton(), SIGNAL(pressed()), this, SLOT(UpdateMathglZoomAndRotation())); } -void SltSpaceDisplay::UpdateMathglDraw() const +void SltSpaceDisplay::UpdateMathglDraw() { + QPushButton *button = qobject_cast(sender()); + if (button != nullptr) { + for (auto iter = objectsIdLegendMap.begin(); iter != objectsIdLegendMap.end(); iter++) { + if (iter->second.get() == button) { + sltSpaceData.SetObjectVisible(iter->first, button->isChecked()); + } + } + } + UpdateDrawQMathGl(); } diff --git a/chart_plugin/src/slt_space_display.h b/chart_plugin/src/slt_space_display.h index 4e052b0837c25f5d77831fd298fde69211ff4b1e..1419982866b92aabe1a658b92de0b013d59b6265 100755 --- a/chart_plugin/src/slt_space_display.h +++ b/chart_plugin/src/slt_space_display.h @@ -213,7 +213,7 @@ public Q_SLOTS: * 输出参数:无 * 返回值:无 */ - void UpdateMathglDraw() const; + void UpdateMathglDraw(); /* * 功能:恢复mathgl画布为默认视角 diff --git a/chart_plugin/src/st_space/st_space_data.cpp b/chart_plugin/src/st_space/st_space_data.cpp index fe0e11985b75ee016a2762087b1b72a05a31dae3..42c7ba38a379841e0340e5c8d04335cb492e8a5d 100755 --- a/chart_plugin/src/st_space/st_space_data.cpp +++ b/chart_plugin/src/st_space/st_space_data.cpp @@ -54,19 +54,33 @@ void StSpaceData::SetObjectsCurveData(const vector &pointVector { objectsMap.clear(); objectsIdTypeMap.clear(); + objectsTypeIdMap.clear(); if (pointVector.empty()) { return; } + QStringList listId; for (const auto &point : pointVector) { int32_t type = point.type; QString id = QString::fromStdString(point.id); + + listId.push_back(id); + if (!QueueHaveId(id)) { + LimitQueueNumber(listId); + objectsIdVisibleQueue.enqueue(QPair(id, true)); + } + if (!objectsMap.contains(id)) { QPolygonF objectIdNew; objectIdNew.append(QPointF(point.tValue, point.sValue)); objectsMap.insert(id, objectIdNew); objectsIdTypeMap.insert(id, type); + QStringList listId = objectsTypeIdMap.value(type); + if (!listId.contains(id)) { + listId.push_back(id); + objectsTypeIdMap.insert(type, listId); + } continue; } objectsMap[id].append(QPointF(point.tValue, point.sValue)); @@ -98,13 +112,43 @@ const QMap &StSpaceData::GetObjectsIdTypeMap() const return objectsIdTypeMap; } +const QMap &StSpaceData::GetObjectsTypeIdMap() const +{ + return objectsTypeIdMap; +} + +void StSpaceData::SetObjectVisible(const QString &id, bool isVisible) +{ + for (auto iter = objectsIdVisibleQueue.begin(); iter != objectsIdVisibleQueue.end(); iter++) { + if (iter->first == id) { + iter->second = isVisible; + return; + } + } + + objectsIdVisibleQueue.enqueue(QPair(id, isVisible)); +} + +bool StSpaceData::GetObjectVisible(const QString &id) const +{ + for (auto pair : objectsIdVisibleQueue) { + if (pair.first == id) { + return pair.second; + } + } + return true; +} + void StSpaceData::Clear() { + objectsIdVisibleQueue.clear(); + firstStTrack.clear(); optimizedStTrack.clear(); stSpeedLimit.clear(); objectsMap.clear(); objectsIdTypeMap.clear(); + objectsTypeIdMap.clear(); } bool StSpaceData::Add(const custom::StSpace::ConstPtr &msg) @@ -125,4 +169,29 @@ bool StSpaceData::Add(const custom::StSpace::ConstPtr &msg) } return false; } + +bool StSpaceData::QueueHaveId(const QString &id) +{ + for (auto iter = objectsIdVisibleQueue.begin(); iter != objectsIdVisibleQueue.end(); iter++) { + if (iter->first == id) { + return true; + } + } + return false; +} + +void StSpaceData::LimitQueueNumber(const QStringList &listId) +{ + int32_t queueMaxNumber = 1000; + if (objectsIdVisibleQueue.count() < queueMaxNumber) { + return; + } + + for (auto iter = objectsIdVisibleQueue.begin(); iter != objectsIdVisibleQueue.end(); iter++) { + if (!listId.contains(iter->first)) { + objectsIdVisibleQueue.erase(iter); + return; + } + } +} } // namespace chart_plugin diff --git a/chart_plugin/src/st_space/st_space_data.h b/chart_plugin/src/st_space/st_space_data.h index 31b7fa3ce1c1c9f71f137d9c63360874bc9becca..a028f9f6bccd09f2f302c54fad0f7fc1d81855a8 100755 --- a/chart_plugin/src/st_space/st_space_data.h +++ b/chart_plugin/src/st_space/st_space_data.h @@ -29,6 +29,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include +#include #include "custom/StSpace.h" @@ -94,6 +96,30 @@ public: * 返回值:QMap障碍物属性数据,障碍物id和其对应type信息 */ const QMap &GetObjectsIdTypeMap() const; + + /* + * 功能:获取障碍物属性数据 + * 输入参数:无 + * 输出参数:无 + * 返回值:QMap障碍物属性数据,障碍物type和其对应id信息 + */ + const QMap &GetObjectsTypeIdMap() const; + + /* + * 功能:设置障碍物是否显示 + * 输入参数:id-障碍物id属性,isVisible-障碍物显隐 + * 输出参数:无 + * 返回值:无 + */ + void SetObjectVisible(const QString &id, bool isVisible); + + /* + * 功能:获取障碍物是否显示 + * 输入参数:id-障碍物id属性 + * 输出参数:无 + * 返回值:障碍物是否显示 + */ + bool GetObjectVisible(const QString &id) const; private: /* @@ -111,6 +137,22 @@ private: * 返回值:无 */ void SetObjectsCurveData(const std::vector &pointVector); + + /* + * 功能:查询objectsIdVisibleQueue队列是否有id数据 + * 输入参数:id-障碍物id属性 + * 输出参数:无 + * 返回值:无 + */ + bool QueueHaveId(const QString &id); + + /* + * 功能:设置objectsIdVisibleQueue队列上限 + * 输入参数:listId-障碍物链表 + * 输出参数:无 + * 返回值:无 + */ + void LimitQueueNumber(const QStringList &listId); private: QPolygonF firstStTrack {}; @@ -119,6 +161,9 @@ private: QMap objectsMap {}; QMap objectsIdTypeMap {}; + QMap objectsTypeIdMap {}; + + QQueue> objectsIdVisibleQueue {}; }; } // namespace chart_plugin diff --git a/chart_plugin/src/st_space/ui_st_widget.cpp b/chart_plugin/src/st_space/ui_st_widget.cpp index e9381be45e15fdda7778d3d94bbbc3bb5ffeb8ac..0cd8bdb52e06bfde4607c8c5ec9a7d7e9307bca2 100755 --- a/chart_plugin/src/st_space/ui_st_widget.cpp +++ b/chart_plugin/src/st_space/ui_st_widget.cpp @@ -35,10 +35,10 @@ const QString QWT_PLOT_NAME = QString::fromUtf8("qwtPlot"); const int32_t WIDGET_WIDTH = 572; const int32_t WIDGET_HEIGHT = 327; const int32_t WIDGET_MIN_WIDTH = 320; -const int32_t WIDGET_MIN_HEIGHT = 180; +const int32_t WIDGET_MIN_HEIGHT = 260; const int32_t QWTPLOT_MIN_WIDTH = 240; -const int32_t QWTPLOT_MIN_HEIGHT = 120; +const int32_t QWTPLOT_MIN_HEIGHT = 230; const int32_t QWTPLOT_LINEWIDTH = 1; const int32_t QSPACER_ITEM_WIDTH = 40; @@ -357,19 +357,11 @@ void UiStWidget::SetupUi(QWidget &widget) InitPalette(palette); widget.setPalette(palette); widget.setAutoFillBackground(true); - verticalLayout = new (std::nothrow) QVBoxLayout(&widget); - if (verticalLayout == nullptr) { - ROS_ERROR("Failed to Create the verticalLayout of QVBoxLayout."); - return; - } - + + verticalLayout = new QVBoxLayout(&widget); verticalLayout->setObjectName(VERTICALL_LAYOUT_NAME); - qwtPlot = new (std::nothrow) QwtPlot(&widget); - if (qwtPlot == nullptr) { - ROS_ERROR("Failed to Create the qwtPlot of QwtPlot."); - return; - } - + + qwtPlot = new QwtPlot(&widget); qwtPlot->setObjectName(QWT_PLOT_NAME); qwtPlot->setMinimumSize(QSize(QWTPLOT_MIN_WIDTH, QWTPLOT_MIN_HEIGHT)); qwtPlot->setFrameShape(QFrame::NoFrame); diff --git a/chart_plugin/src/st_space_display.cpp b/chart_plugin/src/st_space_display.cpp index 0aec9380374534694d5233509aa18e62a7bd3e54..72d15615922a9b2faa5533214604e9a107c1d151 100755 --- a/chart_plugin/src/st_space_display.cpp +++ b/chart_plugin/src/st_space_display.cpp @@ -327,6 +327,11 @@ void StSpaceDisplay::LegendChecked(const QVariant &itemInfo, bool isVisible) if (plotItem != nullptr) { plotItem->setVisible(isVisible); + for (auto iter = stObjectsCurveMap.begin(); iter != stObjectsCurveMap.end(); iter++) { + if (plotItem == iter->second.get()) { + stSpaceData.SetObjectVisible(iter->first, isVisible); + } + } } ui.qwtPlot->replot(); @@ -686,42 +691,38 @@ void StSpaceDisplay::SetObjectProperty(int32_t objectType) objectsTypeAlphaProperty.insert(objectType, objectsTypeAlphaPropertyPtr); } -void StSpaceDisplay::ShowObjectsCurve(const QMap &objectsIdType, - const QMap &stObjectsMap) +void StSpaceDisplay::ShowObjects(const QMap &stObjectsMap) { - if((!stObjectsCurveMap.empty()) && (stObjectsCurveMap.size() == stObjectsMap.size())) { - for (auto &stObjectsCurve : stObjectsCurveMap) { - stObjectsCurve.second->setSamples(stObjectsMap.value(stObjectsCurve.first)); - } - return; - } + auto objectsTypeId = stSpaceData.GetObjectsTypeIdMap(); if (!stObjectsCurveMap.empty()) { stObjectsCurveMap.clear(); } - QList listType = objectsIdType.values(); - qSort(listType.begin(), listType.end()); + QList listType = objectsTypeId.keys(); - for (auto type : listType) { - QString objectId = objectsIdType.key(type); - SetObjectProperty(type); - if (!objectsTypeTitleProperty.contains(type) || objectsTypeTitleProperty[type] == nullptr) { - continue; + for (auto objectType : listType) { + QStringList listId = objectsTypeId.value(objectType); + qSort(listId.begin(), listId.end()); + for (auto objectId : listId) { + SetObjectProperty(objectType); + if (!objectsTypeTitleProperty.contains(objectType) || objectsTypeTitleProperty[objectType] == nullptr) { + continue; + } + QString objectName = QString("%1: %2").arg(objectsTypeTitleProperty[objectType]->getString()).arg(objectId); + QColor color = GetObjectsTypeColor(objectType); + unique_ptr curve = make_unique(objectName); + curve->setTitle(objectName); + color.setAlpha(objectsTypeAlphaProperty[objectType]->getFloat() * 0xFF); + curve->setPen(color, OBJECT_CURVE_PEN_WIDTH); + curve->setBrush(color); + curve->setRenderHint(QwtPlotItem::RenderAntialiased, true); + curve->setLegendAttribute(curve->LegendShowBrush); + curve->attach(ui.qwtPlot); + curve->setSamples(stObjectsMap.value(objectId)); + ShowCurve(curve.get(), stSpaceData.GetObjectVisible(objectId)); + stObjectsCurveMap.insert(std::make_pair(objectId, std::move(curve))); } - QString objectName = QString("%1: %2").arg(objectsTypeTitleProperty[type]->getString()).arg(objectId); - QColor color = GetObjectsTypeColor(type); - unique_ptr curve = make_unique(objectName); - curve->setTitle(objectName); - color.setAlpha(objectsTypeAlphaProperty[type]->getFloat() * 0xFF); - curve->setPen(color, OBJECT_CURVE_PEN_WIDTH); - curve->setBrush(color); - curve->setRenderHint(QwtPlotItem::RenderAntialiased, true); - curve->setLegendAttribute(curve->LegendShowBrush); - curve->attach(ui.qwtPlot); - curve->setSamples(stObjectsMap.value(objectId)); - ShowCurve(curve.get(), true); - stObjectsCurveMap.insert(std::make_pair(objectId, std::move(curve))); } } @@ -731,8 +732,7 @@ void StSpaceDisplay::DrawObjects(const QMap &stObjectsMap) return; } - const QMap objectsIdType = stSpaceData.GetObjectsIdTypeMap(); - ShowObjectsCurve(objectsIdType, stObjectsMap); + ShowObjects(stObjectsMap); UpdateObjectsTypeChoice(); } @@ -767,6 +767,10 @@ void StSpaceDisplay::ProcessMessage(const custom::StSpace::ConstPtr &message) void StSpaceDisplay::ClearData() { + ShowCurve(&firstStTrackCurve, true); + ShowCurve(&optimizedStTrackCurve, true); + ShowCurve(&stSpeedLimitCurve, true); + stSpaceData.Clear(); } @@ -784,14 +788,9 @@ void StSpaceDisplay::ReplotEmptyData() ui.qwtPlot->replot(); } -void StSpaceDisplay::reset() -{ - ChartDisplayClass::reset(); - ClearData(); -} - void StSpaceDisplay::updateTopic() { + ClearData(); ReplotEmptyData(); sub.unsubscribe(); stObjectsCurveMap.clear(); diff --git a/chart_plugin/src/st_space_display.h b/chart_plugin/src/st_space_display.h index 3067554c5d62a46d91c43d6f561a74fe8bb67d01..a53510b9951bc55455aba6e7c93e69aeb08cf2bc 100755 --- a/chart_plugin/src/st_space_display.h +++ b/chart_plugin/src/st_space_display.h @@ -60,14 +60,6 @@ public: */ void onInitialize() override; - /* - * 功能:通知rviz Display清除其状态,同时这里也清除自己的topic数据,继承自父类并重写 - * 输入参数:无 - * 输出参数:无 - * 返回值:无 - */ - void reset() override; - /* * 功能:加载配置文件,继承自父类并重写 * 输入参数:Config @@ -370,11 +362,11 @@ private: /* * 功能:创建并显示障碍物曲线信息 - * 输入参数:objectsIdType-障碍物的Id和对应的类型,stObjectsMap-障碍物的Id和对应的数据 + * 输入参数:stObjectsMap-障碍物的Id和对应的数据 * 输出参数:无 * 返回值:无 */ - void ShowObjectsCurve(const QMap &objectsIdType, const QMap &stObjectsMap); + void ShowObjects(const QMap &stObjectsMap); /* * 功能:更新当前第一条曲线的属性选项的控制展示