renderer.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from api.od import ODAPI
  2. from concrete_syntax.graphviz.renderer import render_object_diagram, make_graphviz_id
  3. from concrete_syntax.graphviz.make_url import show_graphviz
  4. from examples.petrinet.renderer import render_petri_net_to_dot
  5. from examples.semantics.operational.port.renderer import render_port_to_dot
  6. # COLORS
  7. PLACE_BG = "#DAE8FC" # fill color
  8. PLACE_FG = "#6C8EBF" # font, line, arrow
  9. BERTH_BG = "#FFF2CC"
  10. BERTH_FG = "#D6B656"
  11. CAPACITY_BG = "#F5F5F5"
  12. CAPACITY_FG = "#666666"
  13. WORKER_BG = "#D5E8D4"
  14. WORKER_FG = "#82B366"
  15. GENERATOR_BG = "#FFE6CC"
  16. GENERATOR_FG = "#D79B00"
  17. CLOCK_BG = "black"
  18. CLOCK_FG = "white"
  19. def graphviz_style_fg_bg(fg, bg):
  20. return f"style=filled,fillcolor=\"{bg}\",color=\"{fg}\",fontcolor=\"{fg}\""
  21. def render_port(state, m, mm):
  22. dot = render_object_diagram(state, m, mm,
  23. reify=True,
  24. only_render=[
  25. # Only render these types
  26. "Place", "Berth", "CapacityConstraint", "WorkerSet", "Generator", "Clock",
  27. "connection", "capacityOf", "canOperate", "generic_link",
  28. # Petri Net types not included (they are already rendered by other function)
  29. # Port-State-types not included to avoid cluttering the diagram, but if you need them, feel free to add them.
  30. ],
  31. type_to_style={
  32. "Place": graphviz_style_fg_bg(PLACE_FG, PLACE_BG),
  33. "Berth": graphviz_style_fg_bg(BERTH_FG, BERTH_BG),
  34. "CapacityConstraint": graphviz_style_fg_bg(CAPACITY_FG, CAPACITY_BG),
  35. "WorkerSet": "shape=oval,"+graphviz_style_fg_bg(WORKER_FG, WORKER_BG),
  36. "Generator": "shape=parallelogram,"+graphviz_style_fg_bg(GENERATOR_FG, GENERATOR_BG),
  37. "Clock": graphviz_style_fg_bg(CLOCK_FG, CLOCK_BG),
  38. # same blue as Place, thick line:
  39. "connection": f"color=\"{PLACE_FG}\",fontcolor=\"{PLACE_FG}\",penwidth=2.0",
  40. # same grey as CapacityConstraint
  41. "capacityOf": f"color=\"{CAPACITY_FG}\",fontcolor=\"{CAPACITY_FG}\"",
  42. # same green as WorkerSet
  43. "canOperate": f"color=\"{WORKER_FG}\",fontcolor=\"{WORKER_FG}\"",
  44. # purple line
  45. "generic_link": "color=purple,fontcolor=purple,arrowhead=onormal",
  46. }
  47. )
  48. return dot
  49. def render_port_and_petri_net(state, m, mm):
  50. od = ODAPI(state, m, mm)
  51. dot = ""
  52. dot += "// petri net:\n"
  53. dot += render_petri_net_to_dot(od)
  54. dot += "\n// the rest:\n"
  55. dot += render_port(state, m, mm)
  56. return dot
  57. def show_port_and_petri_net(state, m, mm, engine="dot"):
  58. show_graphviz(render_port_and_petri_net(state, m, mm), engine=engine)