3 #include <SimoxUtility/algorithm/string.h>
4 #include <SimoxUtility/filesystem/list_directory.h>
5 #include <VirtualRobot/XML/ObjectIO.h>
13 namespace fs = std::filesystem;
17 packageName(objectsPackageName), relObjectsDir(relObjectsDir)
26 absPackageDataDir.clear();
36 ObjectFinder::init()
const
38 if (absPackageDataDir.empty())
41 absPackageDataDir = packageFinder.getDataDir();
42 if (absPackageDataDir.empty())
44 ARMARX_WARNING <<
"Could not find package '" << packageName <<
"'.";
58 ObjectFinder::isDatasetDirValid(
const path& path)
const
60 return std::filesystem::is_directory(
path);
63 std::optional<ObjectInfo>
73 return ObjectInfo(packageName, absPackageDataDir, relObjectsDir, dataset, name);
76 const std::vector<std::string>& datasets =
getDatasets();
77 for (
const std::string& ds : datasets)
79 if (fs::is_directory(_rootDirAbs() / ds / name))
81 return ObjectInfo(packageName, absPackageDataDir, relObjectsDir, ds, name);
86 ss <<
"Did not find object '" << name <<
"' in any of these datasets:\n";
87 for (
const auto& ds : datasets)
89 ss <<
"- " << ds <<
"\n";
91 ss <<
"Objects root directory: " << _rootDirAbs();
97 std::optional<ObjectInfo>
103 std::optional<ObjectInfo>
106 return findObject(
id.dataset(),
id.className());
109 std::optional<ObjectInfo>
115 std::vector<std::string>
119 std::vector<std::string> datasets;
122 datasets.push_back(dir.filename());
127 std::vector<ObjectFinder::path>
135 const bool local =
false;
136 std::vector<path> dirs = simox::fs::list_directory(_rootDirAbs(), local);
137 std::vector<path> datasetDirs;
138 for (
const path& p : dirs)
140 if (isDatasetDirValid(p))
142 datasetDirs.push_back(p);
148 std::vector<ObjectInfo>
156 const bool local =
true;
157 std::vector<ObjectInfo> objects;
158 for (
const path& datasetDir : simox::fs::list_directory(_rootDirAbs(), local))
160 if (isDatasetDirValid(_rootDirAbs() / datasetDir))
163 for (
const auto& o : dataset)
165 objects.push_back(o);
172 std::vector<armem::articulated_object::ArticulatedObjectDescription>
181 const bool local =
true;
183 std::vector<armem::articulated_object::ArticulatedObjectDescription> objects;
184 for (
const path& datasetDir : simox::fs::list_directory(_rootDirAbs(), local))
186 if (isDatasetDirValid(_rootDirAbs() / datasetDir))
189 objects.insert(objects.end(), dataset.begin(), dataset.end());
195 std::map<std::string, std::vector<ObjectInfo>>
199 std::map<std::string, std::vector<ObjectInfo>> objects;
207 std::vector<ObjectInfo>
215 path datasetDir = _rootDirAbs() / dataset;
216 if (!fs::is_directory(datasetDir))
218 ARMARX_WARNING <<
"Expected dataset directory for dataset '" << dataset <<
"': \n"
223 std::vector<ObjectInfo> objects;
224 const bool local =
true;
225 for (
const path& dir : simox::fs::list_directory(datasetDir, local))
227 if (fs::is_directory(datasetDir / dir))
230 packageName, absPackageDataDir, relObjectsDir, dataset, dir.filename());
231 object.setLogError(logObjectDiscoveryError);
233 if (!checkPaths ||
object.checkPaths())
235 objects.push_back(
object);
242 std::unordered_map<std::string,
243 std::vector<armem::articulated_object::ArticulatedObjectDescription>>
252 const bool local =
true;
254 std::unordered_map<std::string,
255 std::vector<armem::articulated_object::ArticulatedObjectDescription>>
257 for (
const path& datasetDir : simox::fs::list_directory(_rootDirAbs(), local))
259 if (isDatasetDirValid(_rootDirAbs() / datasetDir))
262 datasets[datasetDir] = dataset;
268 std::vector<armem::articulated_object::ArticulatedObjectDescription>
270 bool checkPaths)
const
277 path datasetDir = _rootDirAbs() / dataset;
278 if (!isDatasetDirValid(datasetDir))
280 ARMARX_WARNING <<
"Expected dataset directory for dataset '" << dataset <<
"': \n"
285 std::vector<armem::articulated_object::ArticulatedObjectDescription> objects;
286 const bool local =
true;
287 for (
const path& dir : simox::fs::list_directory(datasetDir, local))
289 if (fs::is_directory(datasetDir / dir))
292 packageName, absPackageDataDir, relObjectsDir, dataset, dir.filename());
293 std::optional<PackageFileLocation> modelFile =
object.getArticulatedModel();
294 if (modelFile.has_value())
297 .
name =
object.idStr(),
298 .xml = {modelFile->package, modelFile->relativePath},
309 VirtualRobot::ManipulationObjectPtr
316 const auto data = ts->simoxXML();
323 return VirtualRobot::ObjectIO::loadManipulationObject(
abs);
326 VirtualRobot::ManipulationObjectPtr
332 VirtualRobot::ObstaclePtr
339 const auto data = ts->simoxXML();
346 return VirtualRobot::ObjectIO::loadObstacle(
abs);
349 VirtualRobot::ObstaclePtr
355 static std::vector<std::string>
359 const bool includeClassName,
360 const std::function<std::optional<std::vector<std::string>>(
const ObjectInfo&)> loadNamesFn)
362 std::vector<std::string>
names;
363 if (includeClassName)
367 if (std::optional<ObjectInfo> info = finder.
findObject(objectID))
369 if (std::optional<std::vector<std::string>> loadedNames = loadNamesFn(*info))
372 names.insert(
names.end(), loadedNames->begin(), loadedNames->end());
378 std::vector<std::string>
381 return _loadNames(*
this,
387 std::vector<std::string>
390 return _loadNames(*
this,
399 logObjectDiscoveryError = logEnabled;
403 ObjectFinder::_rootDirAbs()
const
405 return absPackageDataDir / packageName / relObjectsDir;
409 ObjectFinder::_rootDirRel()
const
415 ObjectFinder::_ready()
const
417 return !absPackageDataDir.empty();