From 546712b4a86cac25ee5f3f6109f937bf36e4ed0f Mon Sep 17 00:00:00 2001 From: mini-1235 Date: Wed, 8 Apr 2026 11:21:33 +0000 Subject: [PATCH] Only add to display dialog if publisher > 0 Signed-off-by: mini-1235 --- .../rviz_common/ros_integration/ros_node_abstraction.hpp | 8 ++++++++ .../ros_integration/ros_node_abstraction_iface.hpp | 2 ++ rviz_common/src/rviz_common/add_display_dialog.cpp | 5 +++++ .../rviz_common/ros_integration/ros_node_abstraction.cpp | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/rviz_common/include/rviz_common/ros_integration/ros_node_abstraction.hpp b/rviz_common/include/rviz_common/ros_integration/ros_node_abstraction.hpp index fba133344..6bf8e1c5c 100644 --- a/rviz_common/include/rviz_common/ros_integration/ros_node_abstraction.hpp +++ b/rviz_common/include/rviz_common/ros_integration/ros_node_abstraction.hpp @@ -85,6 +85,14 @@ class RosNodeAbstraction : public RosNodeAbstractionIface std::map> get_topic_names_and_types() const override; + /// Count the number of publishers for a given topic. + /** + * \param topic_name the name of the topic to count publishers for + * \return the number of publishers for the given topic + */ + RVIZ_COMMON_PUBLIC + size_t count_publishers(const std::string & topic_name) const override; + /// Return a map with service names mapped to a list of types for that service. /** * The node name is what was given when initializing this API. diff --git a/rviz_common/include/rviz_common/ros_integration/ros_node_abstraction_iface.hpp b/rviz_common/include/rviz_common/ros_integration/ros_node_abstraction_iface.hpp index 43b81a73c..271ffb295 100644 --- a/rviz_common/include/rviz_common/ros_integration/ros_node_abstraction_iface.hpp +++ b/rviz_common/include/rviz_common/ros_integration/ros_node_abstraction_iface.hpp @@ -56,6 +56,8 @@ class RosNodeAbstractionIface virtual std::map> get_topic_names_and_types() const = 0; + virtual size_t count_publishers(const std::string & topic_name) const = 0; + virtual std::map> get_service_names_and_types() const = 0; diff --git a/rviz_common/src/rviz_common/add_display_dialog.cpp b/rviz_common/src/rviz_common/add_display_dialog.cpp index cef98c1b8..5855c6cc2 100644 --- a/rviz_common/src/rviz_common/add_display_dialog.cpp +++ b/rviz_common/src/rviz_common/add_display_dialog.cpp @@ -168,6 +168,11 @@ void getPluginGroups( } QString datatype = QString::fromStdString(map_pair.second[0]); + // Check if there is a publisher for this topic, if not we skip it + if (!rviz_ros_node.lock()->count_publishers(map_pair.first)) { + continue; + } + if (datatype_plugins.contains(datatype)) { if ( groups->empty() || diff --git a/rviz_common/src/rviz_common/ros_integration/ros_node_abstraction.cpp b/rviz_common/src/rviz_common/ros_integration/ros_node_abstraction.cpp index e3a40035a..cd1063163 100644 --- a/rviz_common/src/rviz_common/ros_integration/ros_node_abstraction.cpp +++ b/rviz_common/src/rviz_common/ros_integration/ros_node_abstraction.cpp @@ -62,6 +62,11 @@ RosNodeAbstraction::get_topic_names_and_types() const return raw_node_->get_topic_names_and_types(); } +size_t RosNodeAbstraction::count_publishers(const std::string & topic_name) const +{ + return raw_node_->count_publishers(topic_name); +} + std::map> RosNodeAbstraction::get_service_names_and_types() const {