| |
| |
| |
| |
| |
| |
|
|
| import json |
| import graphviz |
|
|
| COLORS = { |
| "flush": "#999", |
| "cmd": "#0f0", |
| "data": "#00f", |
| "text_data": "#f00", |
| "pcm_frame": "purple", |
| } |
|
|
| connection_types = ["data", "cmd", "audio_frame", "video_frame"] |
|
|
|
|
| def color(port): |
| if port in COLORS: |
| return COLORS[port] |
| return "#000" |
|
|
|
|
| def find_node(nodes, name): |
| for node in nodes: |
| if node["name"] == name: |
| return node |
| return None |
|
|
|
|
| def create_graph(json_data): |
| |
| graph = graphviz.Digraph("G", filename="graph.gv") |
| graph.graph_attr["rankdir"] = "LR" |
| graph.graph_attr["dpi"] = "150" |
| graph.graph_attr["splines"] = "true" |
| graph.attr("node", shape="none") |
|
|
| |
| nodes = json_data["_ten"]["predefined_graphs"][0]["nodes"] |
| connections = json_data["_ten"]["predefined_graphs"][0]["connections"] |
| for node in nodes: |
| node["i_ports"] = ["flush"] |
| node["o_ports"] = ["flush"] |
| for node in nodes: |
| if node["type"] != "extension": |
| continue |
| for connection in connections: |
| if connection["extension"] == node["name"]: |
| for connection_type in connection_types: |
| if connection_type in connection: |
| data = connection[connection_type] |
| for item in data: |
| node["o_ports"].append(item["name"]) |
| for dest in item["dest"]: |
| dest_node = find_node(nodes, dest["extension"]) |
| if dest_node: |
| dest_node["i_ports"].append(item["name"]) |
| for node in nodes: |
| if node["type"] != "extension": |
| continue |
| node["i_ports"] = set(node["i_ports"]) |
| node["o_ports"] = set(node["o_ports"]) |
| print("====iports: ", node["name"], node["i_ports"]) |
| print("====oports: ", node["name"], node["o_ports"]) |
| iports = "" |
| for port in node["i_ports"]: |
| iports += f'<tr><td align="left" port="i_{port}">⊙ {port}</td></tr>' |
| oports = "" |
| for port in node["o_ports"]: |
| oports += f'<tr><td align="right" port="o_{port}">{port} ⊙</td></tr>' |
|
|
| |
| label = f"""< |
| <table border="0" cellborder="1" cellspacing="0"> |
| <tr><td colspan="2" bgcolor="#ddd"><b>{node["name"]}</b></td></tr> |
| <tr><td colspan="2">properties</td></tr> |
| <tr><td colspan="2">extensionGroup<br/>{node["extension_group"]}</td></tr> |
| <tr><td> |
| <table border="0" cellspacing="0">{iports}</table> |
| </td> |
| <td> |
| <table border="0" cellspacing="0">{oports}</table> |
| </td> |
| </tr> |
| </table>>""" |
| graph.node(node["name"], label) |
|
|
| |
| for connection in connections: |
| for connection_type in connection_types: |
| if connection_type in connection: |
| for data in connection[connection_type]: |
| for dest in data["dest"]: |
| graph.edge( |
| f'{connection["extension"]}:o_{data["name"]}', |
| f'{dest["extension"]}:i_{data["name"]}', |
| color=color(data["name"]), |
| label=connection_type, |
| ) |
|
|
| |
| print(graph.source) |
| graph.render("graph", format="png") |
| graph.view() |
|
|
|
|
| |
| with open("../property.json") as f: |
| data = json.load(f) |
|
|
| |
| create_graph(data) |
|
|