renderer.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from api.od import ODAPI
  2. from concrete_syntax.graphviz.make_url import show_graphviz
  3. from concrete_syntax.graphviz.renderer import make_graphviz_id
  4. try:
  5. import graphviz
  6. HAVE_GRAPHVIZ = True
  7. except ImportError:
  8. HAVE_GRAPHVIZ = False
  9. def render_tokens(num_tokens: int):
  10. if 0 <= num_tokens <= 3:
  11. return '●'*num_tokens
  12. if num_tokens == 4:
  13. return '●●\\n●●'
  14. return str(num_tokens)
  15. def render_petri_net_to_dot(od: ODAPI) -> str:
  16. dot = ""
  17. dot += "rankdir=LR;"
  18. dot += "center=true;"
  19. dot += "margin=1;"
  20. dot += "nodesep=1;"
  21. dot += "subgraph places {"
  22. dot += " node [fontname=Arial,fontsize=10,shape=circle,fixedsize=true,label=\"\", height=.35,width=.35];"
  23. for place_name, place in od.get_all_instances("PNPlace"):
  24. # place_name = od.get_name(place)
  25. try:
  26. place_state = od.get_source(od.get_incoming(place, "pn_of")[0])
  27. num_tokens = od.get_slot_value(place_state, "numTokens")
  28. except IndexError:
  29. num_tokens = 0
  30. dot += f" {make_graphviz_id(place)} [label=\"{place_name}\\n\\n{render_tokens(num_tokens)}\\n\\n­\"];\n"
  31. dot += "}\n"
  32. dot += "subgraph transitions {\n"
  33. dot += " edge [arrowhead=normal];\n"
  34. dot += " node [fontname=Arial,fontsize=10,shape=rect,fixedsize=true,height=.3,width=.12,style=filled,fillcolor=black,color=white];\n"
  35. for transition_name, transition in od.get_all_instances("PNTransition"):
  36. dot += f" {make_graphviz_id(transition)} [label=\"{transition_name}\\n\\n\\n­\"];\n"
  37. dot += "}\n"
  38. for _, arc in od.get_all_instances("arc"):
  39. src = od.get_source(arc)
  40. tgt = od.get_target(arc)
  41. # src_name = od.get_name(od.get_source(arc))
  42. # tgt_name = od.get_name(od.get_target(arc))
  43. dot += f"{make_graphviz_id(src)} -> {make_graphviz_id(tgt)};"
  44. for _, inhib_arc in od.get_all_instances("inh_arc"):
  45. src = od.get_source(inhib_arc)
  46. tgt = od.get_target(inhib_arc)
  47. dot += f"{make_graphviz_id(src)} -> {make_graphviz_id(tgt)} [arrowhead=odot];\n"
  48. return dot
  49. # deprecated
  50. def render_petri_net(od: ODAPI, engine="neato"):
  51. show_graphviz(render_petri_net_to_dot(od), engine=engine)
  52. # use this instead:
  53. def show_petri_net(od: ODAPI, engine="neato"):
  54. show_graphviz(render_petri_net_to_dot(od), engine=engine)