33 from __future__
import with_statement, print_function
38 from rospkg
import MANIFEST_FILE
39 from rospkg.common
import ResourceNotFound
44 for pattern
in patternlist:
47 if re.match(
"^[a-zA-Z0-9_]+$", pattern)
is None:
48 if re.match(pattern, name)
is not None:
57 :param rospack: use rospkg.RosPack() 58 :param rosstack: use rospkg.RosStack() 79 hide_transitives=
True,
92 :param hide_transitives: 93 if true, then dependency of children to grandchildren will be hidden if parent has 95 :param show_system: if true, then system dependencies will be shown 98 if selected_names
is None:
103 selected_names = [x
for x
in selected_names
if x
is not None and x !=
'']
104 excludes = [x
for x
in excludes
if x
is not None and x !=
'']
105 if not selected_names:
106 selected_names = [
'.*']
114 "dotcode_factory": dotcode_factory,
115 "with_stacks": with_stacks,
117 "hide_transitives": hide_transitives,
118 "show_system": show_system,
119 "selected_names": selected_names,
120 "excludes": excludes,
121 "ancestors": ancestors,
122 "descendants": descendants,
123 "hide_wet": hide_wet,
128 selection_changed =
False 130 selection_changed =
True 145 if force_refresh
or selection_changed:
153 for name
in self.rospack.list():
159 for stackname
in self.rosstack.list():
161 manifest = self.rosstack.get_manifest(stackname)
162 if manifest.is_catkin:
168 for package_name
in self.rosstack.packages_of(stackname):
175 'dotcode_factory': dotcode_factory,
179 "simplify": simplify,
180 "colortheme": colortheme,
181 "mark_selected": mark_selected
185 display_changed =
False 187 display_changed =
True 200 if force_refresh
or selection_changed
or display_changed:
207 graph = dotcode_factory.get_graph(rank=self.
rank,
211 packages_in_stacks = []
213 for stackname
in self.
stacks:
222 color = get_color_for_string(stackname)
223 g = dotcode_factory.add_subgraph_to_graph(graph,
231 for package_name
in self.
stacks[stackname][
'packages']:
232 packages_in_stacks.append(package_name)
235 for package_name, attributes
in self.packages.items():
236 if package_name
not in packages_in_stacks:
238 for name1, name2
in self.edges.keys():
239 dotcode_factory.add_edge_to_graph(graph, name1, name2)
249 if attributes
and attributes[
'is_catkin']:
253 elif attributes
and not attributes[
'is_catkin']:
255 if attributes
and 'not_found' in attributes
and attributes[
'not_found']:
258 dotcode_factory.add_node_to_graph(graph, package_name, color=color)
261 if stackname
is None or stackname
in self.
stacks:
263 self.
stacks[stackname] = {
'packages': []}
267 adds object based on package_name to self.packages 268 :param parent: packagename which referenced package_name (for debugging only) 276 if catkin_package
is None:
278 self.
packages[package_name] = {
'is_catkin': catkin_package}
282 stackname = self.rospack.stack_of(package_name)
283 except ResourceNotFound
as e:
285 'RosPackageGraphDotcodeGenerator._add_package(%s), ' 286 'parent %s: ResourceNotFound:' % (package_name, parent), e)
288 if not stackname
is None and stackname !=
'':
289 if not stackname
in self.
stacks:
291 self.
stacks[stackname][
'packages'].append(package_name)
298 if self.
hide_wet and catkin_package:
300 if self.
hide_dry and catkin_package
is False:
308 package_path = self.rospack.get_path(package_name)
309 manifest_file = os.path.join(package_path, MANIFEST_FILE)
310 self.
package_types[package_name] =
not os.path.exists(manifest_file)
311 except ResourceNotFound:
318 self.
edges[(name1, name2)] = attributes
321 self, package_name, expanded_up=
None,
322 depth=
None, implicit=
False, parent=
None):
324 :param package_name: the name of package for which to add ancestors 325 :param expanded_up: names that have already been expanded (to avoid cycles) 326 :param depth: how many layers to follow 327 :param implicit: arg to rospack 328 :param parent: package that referenced package_name for error message only 332 if traversed_depth
is None:
334 if depth
is not None and traversed_depth >= depth:
345 if expanded_up
is None:
347 expanded_up.append(package_name)
350 depends_on = self.rospack.get_depends_on(package_name, implicit=implicit)
351 except ResourceNotFound
as e:
353 'RosPackageGraphDotcodeGenerator.add_package_ancestors_recursively(%s),' 354 ' parent %s: ResourceNotFound:' % (package_name, parent), e)
359 new_nodes.append(dep_on_name)
360 self.
_add_edge(dep_on_name, package_name)
362 expanded_up.append(dep_on_name)
363 for dep_on_name
in new_nodes:
365 expanded_up=expanded_up,
371 self, package_name, expanded=
None,
372 depth=
None, implicit=
False, parent=
None):
375 if traversed_depth
is None:
377 if depth
is not None and traversed_depth >= depth:
390 expanded.append(package_name)
394 depends = self.rospack.get_depends(package_name, implicit=implicit)
395 except ResourceNotFound:
397 manifest = self.rosstack.get_manifest(package_name)
398 if manifest.is_catkin:
399 depends = [d.name
for d
in manifest.depends]
402 except ResourceNotFound
as e:
404 'RosPackageGraphDotcodeGenerator.add_package_descendants_recursively(%s), ' 405 'parent: %s: ResourceNotFound:' % (package_name, parent), e)
409 rosdeps = self.rospack.get_rosdeps(package_name, implicit=implicit)
414 expanded.append(dep_name)
418 new_nodes.append(dep_name)
421 expanded.append(dep_name)
422 for dep_name
in new_nodes:
def generate_dotcode(self, dotcode_factory, selected_names=None, excludes=None, depth=3, with_stacks=True, descendants=True, ancestors=True, hide_transitives=True, show_system=False, mark_selected=True, colortheme=None, rank='same', ranksep=0.2, rankdir='TB', simplify=True, force_refresh=False, hide_wet=False, hide_dry=False)
def _add_edge(self, name1, name2, attributes=None)
def __init__(self, rospack, rosstack)
def generate(self, dotcode_factory)
def _generate_package(self, dotcode_factory, graph, package_name, attributes=None)
def _hide_package(self, package_name)
def _add_stack(self, stackname)
def add_package_ancestors_recursively(self, package_name, expanded_up=None, depth=None, implicit=False, parent=None)
def _add_package(self, package_name, parent=None)
def matches_any(name, patternlist)
def _is_package_wet(self, package_name)
def add_package_descendants_recursively(self, package_name, expanded=None, depth=None, implicit=False, parent=None)