diff --git a/autodoc/doc_state.py b/autodoc/doc_state.py index 38f18d5..53e40a7 100644 --- a/autodoc/doc_state.py +++ b/autodoc/doc_state.py @@ -4,16 +4,6 @@ import os import common as doc -def doc_app_state(state, tab=" │ "): - res = "" - if "+Threads" in state: - for i, tname in enumerate(state["+Threads"]): - if tname[0] == "+": - ch = "├─●" if i < len(state["+Threads"]) - 1 else "╰─●" - res += f"{tab} {ch} {tname[1:]}\n" - return res - - def __doc_obj__(label, obj, id): node = f' {id} [label="{label}\n{obj["Class"]} | ' return node @@ -177,9 +167,8 @@ def __doc_iogam__(id, obj, edges, thread): def __doc_constgam__(id, obj, edges, thread): - node = f' {id} [label="{id[2:]}\n{obj["Class"]} | ' - values = "" - types = "" + node = f" {id} [shape=plaintext, label=<" + node += f"" if "OutputSignals" in obj: for i, (l, sig) in enumerate(obj["OutputSignals"].items()): @@ -193,38 +182,99 @@ def __doc_constgam__(id, obj, edges, thread): thread, ) ) - if i != 0: - values += " | " - types += " | " - values += f' {sig["Default"]}' - types += doc.type_to_string(mtype) - node += "{{ " + types + " } | {" + values + "}}" - node += '", style=filled, fillcolor="#dff"];' + node += f'' + node += f'' + node += "
{id[2:]}
{obj['Class']}
{doc.type_to_string(mtype)}
{l}
' + node += f'{sig["Default"]}
>];\n" + return node, edges + + +def __doc_message_gam__(id, obj, edges, thread): + label = id[2:] + node = f' {id} [label="{label}\n{obj["Class"]} | ' + sigs, edges = __doc_common_gam__(id, obj, edges, thread) + if sigs: + node += sigs + '"];' + else: + node = "" + + if node: + add, edges = __doc_events__(id, obj, edges, thread) + node += add return node, edges def __doc_events__(id, obj, edges, thread): - return "", edges + nodes = "" + for event_id, event in obj["+Events"].items(): + if event_id[0] == "+": + event_id = event_id[1:] + trigger = event["EventTrigger"] + message_ids = [id[1:] for id in event if id[0] == "+"] + for msg_id in message_ids: + nodes += f" {id}_{event_id}_{msg_id} [shape=plaintext, label=<" + nodes += '' + nodes += ( + "" + msg = event[f"+{msg_id}"] + fn = msg["Function"] + nodes += f"" + nodes += "
When" + ) + for i, (sig, val) in enumerate(trigger.items()): + if i > 0: + nodes += "
" + nodes += f"{sig} == {val}" + + nodes += "
Destination{msg['Destination']}
Function" + if fn == "SetOutput": + params = msg["+Parameters"] + nodes += f"{params['SignalName']} = {params['SignalValue']}" + else: + nodes += f"{fn} " + nodes += "
>];\n" + nodes += f" {id} -> {id}_{event_id}_{msg_id} [arrowhead=box];\n" + return nodes, edges + + +def __sanitize__(expression): + if expression[0] == "\n": + expression = expression[1:] + return expression.replace(">", ">").replace("<", "<").replace("\n", "\n") + + +def __doc_mathgam__(id, obj, edges, thread): + label = id[2:] + node = f' {id} [label="{label}\n{obj["Class"]} | ' + node += __sanitize__(obj["Expression"]) + " | " + sigs, edges = __doc_common_gam__(id, obj, edges, thread) + if sigs: + node += sigs + '"];' + else: + node = "" + return node, edges + + +__gams_fns__ = { + "IOGAM": __doc_iogam__, + "ConstantGAM": __doc_constgam__, + "TriggeredIOGAM": __doc_triggered_iogam__, + "MathExpressionGAM": __doc_mathgam__, + "MessageGAM": __doc_message_gam__, +} def __doc_gam__(label, obj, edges, thread): id = f"fn{label}" cls = obj["Class"] + if cls in __gams_fns__: + return __gams_fns__[cls](id, obj, edges, thread) node = f' {id} [label="{label}\n{obj["Class"]} | ' - if cls == "ConstantGAM": - return __doc_constgam__(id, obj, edges, thread) - elif cls == "IOGAM": - return __doc_iogam__(id, obj, edges, thread) - elif cls == "TriggeredIOGAM": - return __doc_triggered_iogam__(id, obj, edges, thread) - else: - sigs, edges = __doc_common_gam__(id, obj, edges, thread) + sigs, edges = __doc_common_gam__(id, obj, edges, thread) if sigs: node += sigs + '"];' else: node = "" - if cls == "MessageGAM": - extra, edges = __doc_events__(id, obj, edges, thread) return node, edges @@ -372,6 +422,8 @@ def doc_state(label, state, app): graph += "nodesep = 0.5;\n" graph += "rankdir = LR;\n" graph += "node [shape=Mrecord];\n" + graph += f"label={label[1:]}>;\n" + graph += "fontsize=40;\n" graph += "\n" arrows = "" ext = "" @@ -387,10 +439,10 @@ def doc_state(label, state, app): obj = app["+Functions"][f"+{fn}"] node, edges = __doc_gam__(fn, obj, edges, tname[1:]) graph += f"{node}\n" - graph += f"\n label = < {tname[1:]} >;\n" + graph += f"\n label = {tname[1:]} >;\n" graph += " fontsize = 24.0;\n" graph += " penwidth = 3;\n" - graph += ' color = "#0A0";\n' + graph += ' color = "#1A1A1A";\n' graph += "}\n" if "+Data" in app: for key, obj in app["+Data"].items():