7 #include <QApplication> 8 #include <QProgressDialog> 13 #include <QElapsedTimer> 14 #include <condition_variable> 23 DataLoadROS::DataLoadROS()
30 DataLoadROS::~DataLoadROS()
34 void StrCat(
const std::string& a,
const std::string& b, std::string& out)
37 out.reserve(a.size() + b.size());
47 std::vector<std::pair<QString, QString>>
50 std::vector<std::pair<QString, QString>> all_topics;
53 bool ignoreAll =
false;
57 const auto&
topic = conn->topic;
58 const auto&
md5sum = conn->md5sum;
59 const auto&
datatype = conn->datatype;
62 all_topics.push_back(std::make_pair(QString(
topic.c_str()), QString(
datatype.c_str())));
69 catch (std::exception& ex)
74 all_topics.pop_back();
84 QMessageBox msgBox(
nullptr);
85 msgBox.setWindowTitle(
"ROS bag error");
86 msgBox.setText(QString(
"Topic ") + QString(
topic.c_str()) + QString(
": ") + QString(ex.what()));
88 QPushButton* buttonCancel = msgBox.addButton(tr(
"Cancel"), QMessageBox::RejectRole);
89 QPushButton* buttonIgnore = msgBox.addButton(tr(
"Ignore"), QMessageBox::YesRole);
90 QPushButton* buttonIgnoreAll = msgBox.addButton(tr(
"Ignore all"), QMessageBox::AcceptRole);
91 msgBox.setDefaultButton(buttonIgnoreAll);
93 if (msgBox.clickedButton() == buttonCancel)
98 if (msgBox.clickedButton() == buttonIgnoreAll)
110 auto temp_bag = std::make_shared<rosbag::Bag>();
118 QMessageBox::warning(
nullptr, tr(
"Error"), QString(
"rosbag::open thrown an exception:\n") + QString(ex.what()));
123 auto all_topics =
getAllTopics(temp_bag.get(), ros_parser);
140 if (dialog->exec() !=
static_cast<int>(QDialog::Accepted))
165 std::set<std::string> topic_selected;
168 topic_selected.insert(
topic.toStdString());
171 QProgressDialog progress_dialog;
172 progress_dialog.setLabelText(
"Loading... please wait");
173 progress_dialog.setWindowModality(Qt::ApplicationModal);
177 progress_dialog.setRange(0, bag_view.
size() - 1);
178 progress_dialog.show();
187 std::vector<uint8_t>
buffer;
191 const std::string& topic_name = msg_instance.getTopic();
192 double msg_time = msg_instance.getTime().toSec();
195 if (topic_selected.find(topic_name) == topic_selected.end())
201 if (msg_count++ % 100 == 0)
203 progress_dialog.setValue(msg_count);
204 QApplication::processEvents();
206 if (progress_dialog.wasCanceled())
213 const size_t msg_size = msg_instance.size();
214 buffer.resize(msg_size);
216 msg_instance.write(stream);
218 MessageRef msg_serialized(buffer.data(), buffer.size());
220 double tmp_timestamp = msg_time;
221 ros_parser.
parseMessage(topic_name, msg_serialized, tmp_timestamp);
225 plot_consecutive.
pushBack(data_point);
227 auto plot_pair = plot_map.
user_defined.find(topic_name);
236 qDebug() <<
"The loading operation took" << timer.elapsed() <<
"milliseconds";
void xmlLoadState(const QDomElement &parent_element)
void xmlSaveState(QDomDocument &doc, QDomElement &plugin_elem) const
std::vector< const char * > _extensions
static void registerMessage(const std::string &topic_name, const std::string &md5sum, const std::string &datatype, const std::string &definition)
std::vector< const ConnectionInfo *> getConnections()
const Time TIME_MIN(0, 1)
QStringList selected_datasources
virtual bool xmlLoadState(const QDomElement &parent_element) override
void registerMessageType(const std::string &topic_name, const std::string &topic_type, const std::string &definition)
virtual bool xmlSaveState(QDomDocument &doc, QDomElement &parent_element) const override
void StrCat(const std::string &a, const std::string &b, std::string &out)
virtual bool readDataFromFile(PJ::FileLoadInfo *fileload_info, PJ::PlotDataMapRef &destination) override
ROSTIME_DECL const Time TIME_MAX
AnySeriesMap::iterator addUserDefined(const std::string &name, PlotGroup::Ptr group={})
bool parseMessage(const std::string &topic_name, MessageRef serialized_msg, double ×tamp)
void saveToSettings(QSettings &setting, QString prefix) const
virtual const std::vector< const char * > & compatibleFileExtensions() const override
typename PlotDataBase< double, Value >::Point Point
void pushBack(const Point &p) override
std::shared_ptr< rosbag::Bag > _bag
AnySeriesMap user_defined
QDomDocument plugin_config
PJ::RosParserConfig getResult() const
const char * definition()
void loadFromSettings(const QSettings &settings, QString prefix)
void setConfig(const RosParserConfig &config)
std::vector< std::pair< QString, QString > > getAllTopics(const rosbag::Bag *bag, RosCompositeParser &parser)