pluginlib_factory.h
Go to the documentation of this file.
1 /*********************************************************************
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2012, Willow Garage, Inc.
5  * Copyright (c) 2017, Bielefeld University
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * * Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above
15  * copyright notice, this list of conditions and the following
16  * disclaimer in the documentation and/or other materials provided
17  * with the distribution.
18  * * Neither the name of Bielefeld University nor the names of its
19  * contributors may be used to endorse or promote products derived
20  * from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE.
34  *********************************************************************/
35 
36 /* Author: Robert Haschke */
37 
38 #pragma once
39 
40 #include <QHash>
41 #include <QString>
42 #include <QStringList>
43 
44 #include <string>
45 #include <vector>
46 
47 #ifndef Q_MOC_RUN
49 #include <rviz/load_resource.h>
50 #include <functional>
51 #endif
52 
53 #include <rviz/factory.h>
54 
55 namespace moveit_rviz_plugin {
56 
60 template <class Type>
61 class PluginlibFactory : public rviz::Factory
62 {
63 private:
64  struct BuiltInClassRecord
65  {
66  QString class_id_;
67  QString package_;
68  QString name_;
69  QString description_;
70  std::function<Type*()> factory_function_;
71  };
72 
73 public:
74  PluginlibFactory(const QString& package, const QString& base_class_type)
75  : mime_type_(QString("application/%1/%2").arg(package, base_class_type)) {
76  class_loader_ = new pluginlib::ClassLoader<Type>(package.toStdString(), base_class_type.toStdString());
77  }
78  ~PluginlibFactory() override { delete class_loader_; }
79 
81  QString mimeType() const { return mime_type_; }
82 
83  QStringList getDeclaredClassIds() override {
84  QStringList ids;
85  for (const auto& record : built_ins_)
86  ids.push_back(record.class_id_);
87  for (const auto& id : class_loader_->getDeclaredClasses()) {
88  QString sid = QString::fromStdString(id);
89  if (ids.contains(sid))
90  continue; // built_in take precedence
91  ids.push_back(sid);
92  }
93  return ids;
94  }
95 
96  QString getClassDescription(const QString& class_id) const override {
97  auto it = built_ins_.find(class_id);
98  if (it != built_ins_.end()) {
99  return it->description_;
100  }
101  return QString::fromStdString(class_loader_->getClassDescription(class_id.toStdString()));
102  }
103 
104  QString getClassName(const QString& class_id) const override {
105  auto it = built_ins_.find(class_id);
106  if (it != built_ins_.end()) {
107  return it->name_;
108  }
109  return QString::fromStdString(class_loader_->getName(class_id.toStdString()));
110  }
111 
112  QString getClassPackage(const QString& class_id) const override {
113  auto it = built_ins_.find(class_id);
114  if (it != built_ins_.end()) {
115  return it->package_;
116  }
117  return QString::fromStdString(class_loader_->getClassPackage(class_id.toStdString()));
118  }
119 
120  virtual QString getPluginManifestPath(const QString& class_id) const {
121  auto it = built_ins_.find(class_id);
122  if (it != built_ins_.end()) {
123  return "";
124  }
125  return QString::fromStdString(class_loader_->getPluginManifestPath(class_id.toStdString()));
126  }
127 
128  QIcon getIcon(const QString& class_id) const override {
129  QString package = getClassPackage(class_id);
130  QString class_name = getClassName(class_id);
131  QIcon icon = rviz::loadPixmap("package://" + package + "/icons/classes/" + class_name + ".svg");
132  if (icon.isNull()) {
133  icon = rviz::loadPixmap("package://" + package + "/icons/classes/" + class_name + ".png");
134  if (icon.isNull()) {
135  icon = rviz::loadPixmap("package://rviz/icons/default_class_icon.png");
136  }
137  }
138  return icon;
139  }
140 
141  void addBuiltInClass(const QString& package, const QString& name, const QString& description,
142  const std::function<Type*()>& factory_function) {
143  BuiltInClassRecord record;
144  record.class_id_ = package + "/" + name;
145  record.package_ = package;
146  record.name_ = name;
147  record.description_ = description;
148  record.factory_function_ = factory_function;
149  built_ins_[record.class_id_] = record;
150  }
151  template <class Derived>
152  void addBuiltInClass(const QString& name, const QString& description) {
153  addBuiltInClass("Built Ins", name, description, [] { return new Derived(); });
154  }
155 
166  virtual Type* makeRaw(const QString& class_id, QString* error_return = nullptr) {
167  typename QHash<QString, BuiltInClassRecord>::const_iterator iter = built_ins_.find(class_id);
168  if (iter != built_ins_.end()) {
169  Type* instance = iter->factory_function_();
170  if (instance == nullptr && error_return != nullptr) {
171  *error_return = "Factory function for built-in class '" + class_id + "' returned NULL.";
172  }
173  return instance;
174  }
175  try {
176  return class_loader_->createUnmanagedInstance(class_id.toStdString());
177  } catch (pluginlib::PluginlibException& ex) {
178  ROS_ERROR("PluginlibFactory: The plugin for class '%s' failed to load. Error: %s", qPrintable(class_id),
179  ex.what());
180  if (error_return) {
181  *error_return = QString::fromStdString(ex.what());
182  }
183  return nullptr;
184  }
185  }
186 
187 private:
188  const QString mime_type_;
190  QHash<QString, BuiltInClassRecord> built_ins_;
191 };
192 } // namespace moveit_rviz_plugin
moveit_rviz_plugin::PluginlibFactory::BuiltInClassRecord::package_
QString package_
Definition: pluginlib_factory.h:166
pluginlib::ClassLoader::getPluginManifestPath
virtual std::string getPluginManifestPath(const std::string &lookup_name)
description
description
factory.h
moveit_rviz_plugin::PluginlibFactory::BuiltInClassRecord::name_
QString name_
Definition: pluginlib_factory.h:167
moveit_rviz_plugin::PluginlibFactory::makeRaw
virtual Type * makeRaw(const QString &class_id, QString *error_return=nullptr)
Instantiate and return a instance of a subclass of Type using our pluginlib::ClassLoader.
Definition: pluginlib_factory.h:232
moveit_rviz_plugin::PluginlibFactory::getPluginManifestPath
virtual QString getPluginManifestPath(const QString &class_id) const
Definition: pluginlib_factory.h:186
rviz::loadPixmap
QPixmap loadPixmap(const QString &url, bool fill_cache)
pluginlib::PluginlibException
package
string package
moveit_rviz_plugin::PluginlibFactory::getDeclaredClassIds
QStringList getDeclaredClassIds() override
Definition: pluginlib_factory.h:149
moveit_rviz_plugin::PluginlibFactory::~PluginlibFactory
~PluginlibFactory() override
Definition: pluginlib_factory.h:144
ROS_ERROR
#define ROS_ERROR(...)
moveit_rviz_plugin::PluginlibFactory::getIcon
QIcon getIcon(const QString &class_id) const override
Definition: pluginlib_factory.h:194
moveit_rviz_plugin::PluginlibFactory::getClassDescription
QString getClassDescription(const QString &class_id) const override
Definition: pluginlib_factory.h:162
load_resource.h
pluginlib::ClassLoader< Type >
class_loader.hpp
name
name
moveit_rviz_plugin::PluginlibFactory::BuiltInClassRecord::description_
QString description_
Definition: pluginlib_factory.h:168
moveit_rviz_plugin::PluginlibFactory::BuiltInClassRecord
Definition: pluginlib_factory.h:130
pluginlib::ClassLoader::getClassDescription
virtual std::string getClassDescription(const std::string &lookup_name)
pluginlib::ClassLoader::getClassPackage
virtual std::string getClassPackage(const std::string &lookup_name)
Type
Type
moveit_rviz_plugin
moveit_rviz_plugin::PluginlibFactory::addBuiltInClass
void addBuiltInClass(const QString &package, const QString &name, const QString &description, const std::function< Type *()> &factory_function)
Definition: pluginlib_factory.h:207
moveit_rviz_plugin::PluginlibFactory::built_ins_
QHash< QString, BuiltInClassRecord > built_ins_
Definition: pluginlib_factory.h:256
moveit_rviz_plugin::PluginlibFactory::getClassName
QString getClassName(const QString &class_id) const override
Definition: pluginlib_factory.h:170
moveit_rviz_plugin::PluginlibFactory::mimeType
QString mimeType() const
retrieve mime type used for given factory
Definition: pluginlib_factory.h:147
pluginlib::ClassLoader::getName
virtual std::string getName(const std::string &lookup_name)
pluginlib::ClassLoader::createUnmanagedInstance
T * createUnmanagedInstance(const std::string &lookup_name)
moveit_rviz_plugin::PluginlibFactory::class_loader_
pluginlib::ClassLoader< Type > * class_loader_
Definition: pluginlib_factory.h:255
rviz::Factory
moveit_rviz_plugin::PluginlibFactory::BuiltInClassRecord::class_id_
QString class_id_
Definition: pluginlib_factory.h:165
moveit_rviz_plugin::PluginlibFactory::PluginlibFactory
PluginlibFactory(const QString &package, const QString &base_class_type)
Definition: pluginlib_factory.h:140
moveit_rviz_plugin::PluginlibFactory::BuiltInClassRecord::factory_function_
std::function< Type *()> factory_function_
Definition: pluginlib_factory.h:169
moveit_rviz_plugin::PluginlibFactory::mime_type_
const QString mime_type_
Definition: pluginlib_factory.h:254
moveit_rviz_plugin::PluginlibFactory::getClassPackage
QString getClassPackage(const QString &class_id) const override
Definition: pluginlib_factory.h:178
pluginlib::ClassLoader::getDeclaredClasses
std::vector< std::string > getDeclaredClasses()


visualization
Author(s): Robert Haschke
autogenerated on Thu Feb 27 2025 03:39:51