132 lines
5.0 KiB
Python
132 lines
5.0 KiB
Python
|
#!/usr/bin/env python
|
||
|
#
|
||
|
# License: BSD
|
||
|
# https://raw.githubusercontent.com/splintered-reality/py_trees/devel/LICENSE
|
||
|
#
|
||
|
##############################################################################
|
||
|
# Documentation
|
||
|
##############################################################################
|
||
|
|
||
|
"""
|
||
|
.. argparse::
|
||
|
:module: py_trees.demos.dot_graphs
|
||
|
:func: command_line_argument_parser
|
||
|
:prog: py-trees-demo-dot-graphs
|
||
|
|
||
|
.. graphviz:: dot/demo-dot-graphs.dot
|
||
|
|
||
|
"""
|
||
|
|
||
|
##############################################################################
|
||
|
# Imports
|
||
|
##############################################################################
|
||
|
|
||
|
import argparse
|
||
|
import subprocess
|
||
|
import py_trees
|
||
|
|
||
|
import py_trees.console as console
|
||
|
|
||
|
##############################################################################
|
||
|
# Classes
|
||
|
##############################################################################
|
||
|
|
||
|
|
||
|
def description():
|
||
|
name = "py-trees-demo-dot-graphs"
|
||
|
content = "Renders a dot graph for a simple tree, with blackboxes.\n"
|
||
|
if py_trees.console.has_colours:
|
||
|
banner_line = console.green + "*" * 79 + "\n" + console.reset
|
||
|
s = "\n"
|
||
|
s += banner_line
|
||
|
s += console.bold_white + "Dot Graphs".center(79) + "\n" + console.reset
|
||
|
s += banner_line
|
||
|
s += "\n"
|
||
|
s += content
|
||
|
s += "\n"
|
||
|
s += console.white
|
||
|
s += console.bold + " Generate Full Dot Graph" + console.reset + "\n"
|
||
|
s += "\n"
|
||
|
s += console.cyan + " {0}".format(name) + console.reset + "\n"
|
||
|
s += "\n"
|
||
|
s += console.bold + " With Varying Visibility Levels" + console.reset + "\n"
|
||
|
s += "\n"
|
||
|
s += console.cyan + " {0}".format(name) + console.yellow + " --level=all" + console.reset + "\n"
|
||
|
s += console.cyan + " {0}".format(name) + console.yellow + " --level=detail" + console.reset + "\n"
|
||
|
s += console.cyan + " {0}".format(name) + console.yellow + " --level=component" + console.reset + "\n"
|
||
|
s += console.cyan + " {0}".format(name) + console.yellow + " --level=big_picture" + console.reset + "\n"
|
||
|
s += "\n"
|
||
|
s += banner_line
|
||
|
else:
|
||
|
s = content
|
||
|
return s
|
||
|
|
||
|
|
||
|
def epilog():
|
||
|
if py_trees.console.has_colours:
|
||
|
return console.cyan + "And his noodly appendage reached forth to tickle the blessed...\n" + console.reset
|
||
|
else:
|
||
|
return None
|
||
|
|
||
|
|
||
|
def command_line_argument_parser():
|
||
|
parser = argparse.ArgumentParser(description=description(),
|
||
|
epilog=epilog(),
|
||
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||
|
)
|
||
|
parser.add_argument('-l', '--level', action='store',
|
||
|
default='fine_detail',
|
||
|
choices=['all', 'fine_detail', 'detail', 'component', 'big_picture'],
|
||
|
help='visibility level')
|
||
|
return parser
|
||
|
|
||
|
|
||
|
def create_tree(level):
|
||
|
root = py_trees.composites.Selector("Demo Dot Graphs %s" % level)
|
||
|
first_blackbox = py_trees.composites.Sequence("BlackBox 1")
|
||
|
first_blackbox.add_child(py_trees.behaviours.Running("Worker"))
|
||
|
first_blackbox.add_child(py_trees.behaviours.Running("Worker"))
|
||
|
first_blackbox.add_child(py_trees.behaviours.Running("Worker"))
|
||
|
first_blackbox.blackbox_level = py_trees.common.BlackBoxLevel.BIG_PICTURE
|
||
|
second_blackbox = py_trees.composites.Sequence("Blackbox 2")
|
||
|
second_blackbox.add_child(py_trees.behaviours.Running("Worker"))
|
||
|
second_blackbox.add_child(py_trees.behaviours.Running("Worker"))
|
||
|
second_blackbox.add_child(py_trees.behaviours.Running("Worker"))
|
||
|
second_blackbox.blackbox_level = py_trees.common.BlackBoxLevel.COMPONENT
|
||
|
third_blackbox = py_trees.composites.Sequence("Blackbox 3")
|
||
|
third_blackbox.add_child(py_trees.behaviours.Running("Worker"))
|
||
|
third_blackbox.add_child(py_trees.behaviours.Running("Worker"))
|
||
|
third_blackbox.add_child(py_trees.behaviours.Running("Worker"))
|
||
|
third_blackbox.blackbox_level = py_trees.common.BlackBoxLevel.DETAIL
|
||
|
root.add_child(first_blackbox)
|
||
|
root.add_child(second_blackbox)
|
||
|
first_blackbox.add_child(third_blackbox)
|
||
|
return root
|
||
|
|
||
|
|
||
|
##############################################################################
|
||
|
# Main
|
||
|
##############################################################################
|
||
|
|
||
|
def main():
|
||
|
"""
|
||
|
Entry point for the demo script.
|
||
|
"""
|
||
|
args = command_line_argument_parser().parse_args()
|
||
|
args.enum_level = py_trees.common.string_to_visibility_level(args.level)
|
||
|
print(description())
|
||
|
py_trees.logging.level = py_trees.logging.Level.DEBUG
|
||
|
|
||
|
root = create_tree(args.level)
|
||
|
py_trees.display.render_dot_tree(root, args.enum_level)
|
||
|
|
||
|
if py_trees.utilities.which("xdot"):
|
||
|
try:
|
||
|
subprocess.call(["xdot", "demo_dot_graphs_%s.dot" % args.level])
|
||
|
except KeyboardInterrupt:
|
||
|
pass
|
||
|
else:
|
||
|
print("")
|
||
|
console.logerror("No xdot viewer found, skipping display [hint: sudo apt install xdot]")
|
||
|
print("")
|