add renderer for Port + Petri Net + traceability

This commit is contained in:
Joeri Exelmans 2024-12-09 17:09:43 +01:00
parent e4c12b7349
commit 3ddfc96532
5 changed files with 163 additions and 37 deletions

View file

@ -1,5 +1,6 @@
from api.od import ODAPI
from concrete_syntax.graphviz.make_url import show_graphviz
from concrete_syntax.graphviz.renderer import make_graphviz_id
try:
import graphviz
@ -14,37 +15,46 @@ def render_tokens(num_tokens: int):
return '●●\\n●●'
return str(num_tokens)
def render_petri_net(od: ODAPI):
def render_petri_net_to_dot(od: ODAPI) -> str:
dot = ""
dot += "rankdir=LR;"
dot += "center=true;"
dot += "margin=1;"
dot += "nodesep=1;"
dot += "edge [arrowhead=vee];"
dot += "node[fontname=Arial,fontsize=10];\n"
dot += "subgraph places {"
dot += " node [shape=circle,fixedsize=true,label=\"\", height=.35,width=.35];"
for _, place in od.get_all_instances("PNPlace"):
place_name = od.get_name(place)
dot += " node [fontname=Arial,fontsize=10,shape=circle,fixedsize=true,label=\"\", height=.35,width=.35];"
for place_name, place in od.get_all_instances("PNPlace"):
# place_name = od.get_name(place)
try:
place_state = od.get_source(od.get_incoming(place, "pn_of")[0])
num_tokens = od.get_slot_value(place_state, "numTokens")
except IndexError:
num_tokens = 0
dot += f" {place_name} [label=\"{place_name}\\n\\n{render_tokens(num_tokens)}\\n\\n­\"];\n"
print("PLACE", place)
dot += f" {make_graphviz_id(place)} [label=\"{place_name}\\n\\n{render_tokens(num_tokens)}\\n\\n­\"];\n"
dot += "}\n"
dot += "subgraph transitions {"
dot += " node [shape=rect,fixedsize=true,height=.3,width=.12,style=filled,fillcolor=black,color=white];\n"
for transition_name, _ in od.get_all_instances("PNTransition"):
dot += f" {transition_name} [label=\"{transition_name}\\n\\n\\n­\"];\n"
dot += "subgraph transitions {\n"
dot += " edge [arrowhead=normal];\n"
dot += " node [fontname=Arial,fontsize=10,shape=rect,fixedsize=true,height=.3,width=.12,style=filled,fillcolor=black,color=white];\n"
for transition_name, transition in od.get_all_instances("PNTransition"):
dot += f" {make_graphviz_id(transition)} [label=\"{transition_name}\\n\\n\\n­\"];\n"
dot += "}\n"
for _, arc in od.get_all_instances("arc"):
src_name = od.get_name(od.get_source(arc))
tgt_name = od.get_name(od.get_target(arc))
dot += f"{src_name} -> {tgt_name};"
src = od.get_source(arc)
tgt = od.get_target(arc)
# src_name = od.get_name(od.get_source(arc))
# tgt_name = od.get_name(od.get_target(arc))
dot += f"{make_graphviz_id(src)} -> {make_graphviz_id(tgt)};"
for _, inhib_arc in od.get_all_instances("inh_arc"):
src_name = od.get_name(od.get_source(inhib_arc))
tgt_name = od.get_name(od.get_target(inhib_arc))
dot += f"{src_name} -> {tgt_name} [arrowhead=odot];\n"
show_graphviz(dot, engine="neato")
return ""
src = od.get_source(inhib_arc)
tgt = od.get_target(inhib_arc)
dot += f"{make_graphviz_id(src)} -> {make_graphviz_id(tgt)} [arrowhead=odot];\n"
return dot
# deprecated
def render_petri_net(od: ODAPI, engine="neato"):
show_graphviz(render_petri_net_to_dot(od), engine=engine)
# use this instead:
def show_petri_net(od: ODAPI, engine="neato"):
show_graphviz(render_petri_net_to_dot(od), engine=engine)