Directory: | ./ |
---|---|
File: | include/pinocchio/parsers/utils.hpp |
Date: | 2024-08-27 18:20:05 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 21 | 26 | 80.8% |
Branches: | 26 | 64 | 40.6% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | // | ||
2 | // Copyright (c) 2015 - 2016 CNRS | ||
3 | // | ||
4 | |||
5 | #ifndef __pinocchio_parsers_utils_hpp__ | ||
6 | #define __pinocchio_parsers_utils_hpp__ | ||
7 | |||
8 | #include <limits> | ||
9 | #include <sstream> | ||
10 | // #include <stdexcept> | ||
11 | |||
12 | #include <boost/filesystem/fstream.hpp> | ||
13 | #include <boost/foreach.hpp> | ||
14 | #include <boost/format.hpp> | ||
15 | |||
16 | #include "pinocchio/utils/file-explorer.hpp" | ||
17 | #include <boost/filesystem.hpp> | ||
18 | |||
19 | #include <exception> | ||
20 | |||
21 | namespace pinocchio | ||
22 | { | ||
23 | /// | ||
24 | /// \brief Supported model file extensions | ||
25 | /// | ||
26 | enum ModelFileExtensionType | ||
27 | { | ||
28 | UNKNOWN = 0, | ||
29 | URDF | ||
30 | }; | ||
31 | |||
32 | /// | ||
33 | /// \brief Extract the type of the given model file according to its extension | ||
34 | /// | ||
35 | /// \param[in] filename The complete path to the model file. | ||
36 | /// | ||
37 | /// \return The type of the extension of the model file | ||
38 | /// | ||
39 | inline ModelFileExtensionType checkModelFileExtension(const std::string & filename) | ||
40 | { | ||
41 | const std::string extension = filename.substr(filename.find_last_of(".") + 1); | ||
42 | |||
43 | if (extension == "urdf") | ||
44 | return URDF; | ||
45 | |||
46 | return UNKNOWN; | ||
47 | } | ||
48 | |||
49 | /** | ||
50 | * @brief Retrieve the path of the file whose path is given in URL-format. | ||
51 | * Currently convert from the following patterns : package:// or file:// | ||
52 | * | ||
53 | * @param[in] string The path given in the url-format | ||
54 | * @param[in] package_dirs A list of packages directories where to search for files | ||
55 | * if its pattern starts with package:// | ||
56 | * | ||
57 | * @return The path to the file (can be a relative or absolute path) | ||
58 | */ | ||
59 | inline std::string | ||
60 | 942 | retrieveResourcePath(const std::string & string, const std::vector<std::string> & package_dirs) | |
61 | { | ||
62 | |||
63 | namespace bf = boost::filesystem; | ||
64 | 942 | std::string result_path; | |
65 | |||
66 |
1/2✓ Branch 2 taken 942 times.
✗ Branch 3 not taken.
|
942 | const std::string separator("://"); |
67 | 942 | const std::size_t pos_separator = string.find(separator); | |
68 |
1/2✓ Branch 1 taken 942 times.
✗ Branch 2 not taken.
|
942 | bf::path string_path(string); |
69 | |||
70 |
2/2✓ Branch 0 taken 941 times.
✓ Branch 1 taken 1 times.
|
942 | if (pos_separator != std::string::npos) |
71 | { | ||
72 |
1/2✓ Branch 1 taken 941 times.
✗ Branch 2 not taken.
|
941 | std::string scheme = string.substr(0, pos_separator); |
73 |
1/2✓ Branch 1 taken 941 times.
✗ Branch 2 not taken.
|
941 | std::string path = string.substr(pos_separator + 3, std::string::npos); |
74 | |||
75 |
2/6✗ Branch 1 not taken.
✓ Branch 2 taken 941 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 941 times.
✗ Branch 7 not taken.
|
941 | if (scheme == "package" || scheme == "model") |
76 | { | ||
77 | // if exists p1/string, path = p1/string, | ||
78 | // else if exists p2/string, path = p2/string | ||
79 | // else return an empty string that may provoke an error in loadPolyhedronFromResource() | ||
80 | |||
81 | // concatenate package_path with filename | ||
82 |
1/2✓ Branch 1 taken 941 times.
✗ Branch 2 not taken.
|
941 | for (std::size_t i = 0; i < package_dirs.size(); ++i) |
83 | { | ||
84 |
5/10✓ Branch 2 taken 941 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 941 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 941 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 941 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 941 times.
✗ Branch 17 not taken.
|
941 | if (bf::exists(bf::path(package_dirs[i] + "/" + path))) |
85 | { | ||
86 |
2/4✓ Branch 2 taken 941 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 941 times.
✗ Branch 6 not taken.
|
941 | result_path = std::string(package_dirs[i] + "/" + path); |
87 | 941 | break; | |
88 | } | ||
89 | } | ||
90 | } | ||
91 | ✗ | else if (scheme == "file") | |
92 | { | ||
93 | ✗ | result_path = path; | |
94 | } | ||
95 | else | ||
96 | { | ||
97 | ✗ | const std::string exception_message("Schemes of form" + scheme + "are not handled"); | |
98 | ✗ | throw std::invalid_argument(exception_message); | |
99 | } | ||
100 | 941 | } | |
101 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | else if (string_path.is_relative()) |
102 | { | ||
103 | // handle the case where a relative mesh path is specified without using //package | ||
104 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | for (std::size_t i = 0; i < package_dirs.size(); ++i) |
105 | { | ||
106 |
5/10✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
1 | if (bf::exists(bf::path(package_dirs[i] + "/" + string))) |
107 | { | ||
108 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | result_path = std::string(package_dirs[i] + "/" + string); |
109 | 1 | break; | |
110 | } | ||
111 | } | ||
112 | } | ||
113 | else // return the entry string | ||
114 | { | ||
115 | ✗ | result_path = string; | |
116 | } | ||
117 | |||
118 | 1884 | return result_path; | |
119 | 942 | } | |
120 | |||
121 | } // namespace pinocchio | ||
122 | |||
123 | #endif // __pinocchio_parsers_utils_hpp__ | ||
124 |