modules
simulator
src
WorldElements
WorldElementBase.cpp
Go to the documentation of this file.
1
/*+-------------------------------------------------------------------------+
2
| MultiVehicle simulator (libmvsim) |
3
| |
4
| Copyright (C) 2014-2024 Jose Luis Blanco Claraco |
5
| Copyright (C) 2017 Borys Tymchenko (Odessa Polytechnic University) |
6
| Distributed under 3-clause BSD License |
7
| See COPYING |
8
+-------------------------------------------------------------------------+ */
9
10
#include <mrpt/core/format.h>
11
#include <
mvsim/WorldElements/ElevationMap.h
>
12
#include <
mvsim/WorldElements/GroundGrid.h
>
13
#include <
mvsim/WorldElements/HorizontalPlane.h
>
14
#include <
mvsim/WorldElements/OccupancyGridMap.h
>
15
#include <
mvsim/WorldElements/PointCloud.h
>
16
#include <
mvsim/WorldElements/SkyBox.h
>
17
#include <
mvsim/WorldElements/VerticalPlane.h
>
18
19
#include <map>
20
#include <
rapidxml.hpp
>
21
#include <
rapidxml_print.hpp
>
22
#include <
rapidxml_utils.hpp
>
23
#include <sstream>
// std::stringstream
24
#include <string>
25
26
using namespace
mvsim
;
27
28
TClassFactory_worldElements
mvsim::classFactory_worldElements
;
29
30
// Explicit registration calls seem to be one (the unique?) way to assure
31
// registration takes place:
32
void
register_all_world_elements
()
33
{
34
static
bool
done =
false
;
35
if
(done)
36
return
;
37
else
38
done =
true
;
39
40
REGISTER_WORLD_ELEMENT
(
"ground_grid"
,
GroundGrid
)
41
REGISTER_WORLD_ELEMENT
(
"occupancy_grid"
,
OccupancyGridMap
)
42
REGISTER_WORLD_ELEMENT
(
"elevation_map"
,
ElevationMap
)
43
REGISTER_WORLD_ELEMENT
(
"horizontal_plane"
,
HorizontalPlane
)
44
REGISTER_WORLD_ELEMENT
(
"vertical_plane"
,
VerticalPlane
)
45
REGISTER_WORLD_ELEMENT
(
"pointcloud"
,
PointCloud
)
46
REGISTER_WORLD_ELEMENT
(
"skybox"
,
SkyBox
)
47
}
48
49
WorldElementBase::Ptr
WorldElementBase::factory
(
50
World
* parent,
const
rapidxml::xml_node<char>
* root,
const
char
* class_name)
51
{
52
register_all_world_elements
();
53
54
using namespace
std
;
55
using namespace
rapidxml
;
56
57
string
sName;
58
if
(!
root
)
59
{
60
sName = string(class_name);
61
}
62
else
63
{
64
if
(0 != strcmp(
root
->name(),
"element"
))
65
throw
runtime_error(mrpt::format(
66
"[WorldElementBase::factory] XML root element is '%s' "
67
"('<element>' expected)"
,
68
root
->name()));
69
70
// Get class name:
71
const
xml_attribute<>
* attrib_class =
root
->first_attribute(
"class"
);
72
if
(!attrib_class || !attrib_class->value())
73
throw
runtime_error(
74
"[WorldElementBase::factory] Missing mandatory attribute "
75
"'class' in node <element>"
);
76
77
sName = string(attrib_class->value());
78
}
79
auto
we =
classFactory_worldElements
.
create
(sName,
parent
,
root
);
80
81
if
(!we)
82
throw
runtime_error(mrpt::format(
83
"[WorldElementBase::factory] Unknown world element type '%s'"
,
84
root
?
root
->name() :
"(root=nullptr)"
));
85
86
return
we;
87
}
mvsim::VisualObject::parent
World * parent()
Definition:
VisualObject.h:51
mvsim
Definition:
Client.h:21
mvsim::GroundGrid
Definition:
GroundGrid.h:21
mvsim::ClassFactory::create
Ptr create(const std::string &class_name, ARG1 a1) const
Definition:
ClassFactory.h:42
SkyBox.h
mvsim::OccupancyGridMap
Definition:
OccupancyGridMap.h:28
mvsim::SkyBox
Definition:
SkyBox.h:23
mvsim::WorldElementBase::factory
static Ptr factory(World *parent, const rapidxml::xml_node< char > *xml_node, const char *class_name=nullptr)
Definition:
WorldElementBase.cpp:49
rapidxml::xml_attribute
Definition:
rapidxml.hpp:138
register_all_world_elements
void register_all_world_elements()
Definition:
WorldElementBase.cpp:32
mvsim::VerticalPlane
Definition:
VerticalPlane.h:24
rapidxml
Definition:
rapidxml.hpp:57
rapidxml_utils.hpp
HorizontalPlane.h
GroundGrid.h
mvsim::World
Definition:
World.h:82
mvsim::classFactory_worldElements
TClassFactory_worldElements classFactory_worldElements
Definition:
WorldElementBase.cpp:28
PointCloud.h
rapidxml::xml_node< char >
std
OccupancyGridMap.h
mvsim::WorldElementBase::Ptr
std::shared_ptr< WorldElementBase > Ptr
Definition:
WorldElementBase.h:30
mvsim::ClassFactory
Definition:
ClassFactory.h:25
root
root
ElevationMap.h
mvsim::ElevationMap
Definition:
ElevationMap.h:27
mvsim::HorizontalPlane
Definition:
HorizontalPlane.h:23
VerticalPlane.h
rapidxml.hpp
rapidxml_print.hpp
mvsim::PointCloud
Definition:
PointCloud.h:25
REGISTER_WORLD_ELEMENT
#define REGISTER_WORLD_ELEMENT(TEXTUAL_NAME, CLASS_NAME)
Definition:
WorldElementBase.h:56
mvsim
Author(s):
autogenerated on Wed May 28 2025 02:13:08