Skip to content

Commit 30d0e5b

Browse files
authored
[py parsing] Accept pathlib.Path for paths (#22936)
1 parent cf584b5 commit 30d0e5b

File tree

4 files changed

+19
-20
lines changed

4 files changed

+19
-20
lines changed

bindings/pydrake/multibody/parsing_py.cc

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -130,15 +130,8 @@ PYBIND11_MODULE(parsing, m) {
130130
cls_doc.scene_graph.doc)
131131
.def("package_map", &Class::package_map, py_rvp::reference_internal,
132132
cls_doc.package_map.doc)
133-
.def(
134-
"AddModels",
135-
// Pybind11 won't implicitly convert strings to
136-
// std::filesystem::path, but C++ will. Use a lambda to avoid wider
137-
// disruptions in python bindings.
138-
[](Parser& self, const std::string& file_name) {
139-
return self.AddModels(file_name);
140-
},
141-
py::arg("file_name"), cls_doc.AddModels.doc)
133+
.def("AddModels", &Class::AddModels, py::arg("file_name"),
134+
cls_doc.AddModels.doc)
142135
.def("AddModelsFromUrl", &Class::AddModelsFromUrl, py::arg("url"),
143136
cls_doc.AddModelsFromUrl.doc)
144137
.def("AddModelsFromString", &Class::AddModelsFromString,

bindings/pydrake/multibody/test/parsing_test.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import copy
2525
import os
26+
from pathlib import Path
2627
import re
2728
import unittest
2829

@@ -124,8 +125,8 @@ def test_parser_file(self):
124125
urdf_file = FindResourceOrThrow(
125126
"drake/multibody/benchmarks/acrobot/acrobot.urdf")
126127
for dut, file_name in (
127-
(Parser.AddModels, sdf_file),
128-
(Parser.AddModels, urdf_file),
128+
(Parser.AddModels, Path(sdf_file)),
129+
(Parser.AddModels, str(urdf_file)),
129130
):
130131
plant = MultibodyPlant(time_step=0.01)
131132
parser = Parser(plant=plant)
@@ -255,16 +256,16 @@ def test_scoped_frame_names(self, T):
255256
GetScopedFrameByName(plant, "world")
256257
GetScopedFrameByNameMaybe(plant, "world")
257258

258-
def _make_plant_parser_directives(self):
259+
def _make_plant_parser_directives(self, *, path_type=Path):
259260
"""Returns a tuple (plant, parser, directives) for later testing."""
260-
model_dir = os.path.dirname(FindResourceOrThrow(
261+
model_dir = Path(FindResourceOrThrow(
261262
"drake/multibody/parsing/test/"
262-
"process_model_directives_test/package.xml"))
263+
"process_model_directives_test/package.xml")).parent
263264
plant = MultibodyPlant(time_step=0.01)
264265
parser = Parser(plant=plant)
265266
parser.package_map().PopulateFromFolder(model_dir)
266-
directives_file = model_dir + "/add_scoped_top.dmd.yaml"
267-
directives = LoadModelDirectives(directives_file)
267+
directives_file = model_dir / "add_scoped_top.dmd.yaml"
268+
directives = LoadModelDirectives(path_type(directives_file))
268269
return (plant, parser, directives)
269270

270271
def test_load_model_directives_from_string(self):
@@ -296,7 +297,11 @@ def test_process_model_directives(self):
296297

297298
def test_process_model_directives_dispreferred(self):
298299
"""Check the Process... overload that also passes a MbP."""
299-
(plant, parser, directives) = self._make_plant_parser_directives()
300+
(plant, parser, directives) = self._make_plant_parser_directives(
301+
# Use this opportunity to also test a non-standard argument type
302+
# for LoadModelDirectives().
303+
path_type=str,
304+
)
300305
added_models = ProcessModelDirectives(
301306
directives=directives, plant=plant, parser=parser)
302307
model_names = [model.model_name for model in added_models]

multibody/parsing/process_model_directives.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,10 @@ std::vector<ModelInstanceInfo> ProcessModelDirectives(
191191
return added_models;
192192
}
193193

194-
ModelDirectives LoadModelDirectives(const std::string& filename) {
194+
ModelDirectives LoadModelDirectives(const std::filesystem::path& filename) {
195+
const std::string filename_str = filename.string();
195196
return multibody::internal::LoadModelDirectives(
196-
{DataSource::kFilename, &filename});
197+
{DataSource::kFilename, &filename_str});
197198
}
198199

199200
ModelDirectives LoadModelDirectivesFromString(

multibody/parsing/process_model_directives.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace drake {
1313
namespace multibody {
1414
namespace parsing {
1515

16-
ModelDirectives LoadModelDirectives(const std::string& filename);
16+
ModelDirectives LoadModelDirectives(const std::filesystem::path& filename);
1717

1818
ModelDirectives LoadModelDirectivesFromString(
1919
const std::string& model_directives);

0 commit comments

Comments
 (0)