@@ -59,6 +59,33 @@ ModelInterfaceSharedPtr parseURDFFile(const std::string &path)
5959 return urdf::parseURDF ( xml_str );
6060}
6161
62+ bool assignMaterial (const VisualSharedPtr& visual, ModelInterfaceSharedPtr& model, const char * link_name)
63+ {
64+ if (visual->material_name .empty ())
65+ return true ;
66+
67+ const MaterialSharedPtr& material = model->getMaterial (visual->material_name );
68+ if (material)
69+ {
70+ CONSOLE_BRIDGE_logDebug (" urdfdom: setting link '%s' material to '%s'" , link_name, visual->material_name .c_str ());
71+ visual->material = material;
72+ }
73+ else
74+ {
75+ if (visual->material )
76+ {
77+ CONSOLE_BRIDGE_logDebug (" urdfdom: link '%s' material '%s' defined in Visual." , link_name, visual->material_name .c_str ());
78+ model->materials_ .insert (make_pair (visual->material ->name , visual->material ));
79+ }
80+ else
81+ {
82+ CONSOLE_BRIDGE_logWarn (" link '%s' material '%s' undefined." , link_name,visual->material_name .c_str ());
83+ return false ;
84+ }
85+ }
86+ return true ;
87+ }
88+
6289ModelInterfaceSharedPtr parseURDF (const std::string &xml_string)
6390{
6491 ModelInterfaceSharedPtr model (new ModelInterface);
@@ -137,32 +164,15 @@ ModelInterfaceSharedPtr parseURDF(const std::string &xml_string)
137164 }
138165 else
139166 {
140- // set link visual material
167+ // set link visual(s) material
141168 CONSOLE_BRIDGE_logDebug (" urdfdom: setting link '%s' material" , link->name .c_str ());
142169 if (link->visual )
143170 {
144- if (!link->visual ->material_name .empty ())
145- {
146- if (model->getMaterial (link->visual ->material_name ))
147- {
148- CONSOLE_BRIDGE_logDebug (" urdfdom: setting link '%s' material to '%s'" , link->name .c_str (),link->visual ->material_name .c_str ());
149- link->visual ->material = model->getMaterial ( link->visual ->material_name .c_str () );
150- }
151- else
152- {
153- if (link->visual ->material )
154- {
155- CONSOLE_BRIDGE_logDebug (" urdfdom: link '%s' material '%s' defined in Visual." , link->name .c_str (),link->visual ->material_name .c_str ());
156- model->materials_ .insert (make_pair (link->visual ->material ->name ,link->visual ->material ));
157- }
158- else
159- {
160- CONSOLE_BRIDGE_logError (" link '%s' material '%s' undefined." , link->name .c_str (),link->visual ->material_name .c_str ());
161- model.reset ();
162- return model;
163- }
164- }
165- }
171+ assignMaterial (link->visual , model, link->name .c_str ());
172+ }
173+ for (const auto & visual : link->visual_array )
174+ {
175+ assignMaterial (visual, model, link->name .c_str ());
166176 }
167177
168178 model->links_ .insert (make_pair (link->name ,link));
0 commit comments