main.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. from Tkinter import *
  2. from PIL import Image, ImageTk
  3. import tkSimpleDialog
  4. import urllib
  5. import urllib2
  6. import json
  7. import time
  8. sys.path.append("interface/HUTN")
  9. sys.path.append("wrappers")
  10. from modelverse import *
  11. address = "http://127.0.0.1:8001"
  12. taskname = str(random.random())
  13. MAX_WIDTH = 500
  14. MAX_HEIGHT = 500
  15. MM_RENDERED = "MM_rendered_graphical"
  16. init()
  17. login("admin", "admin")
  18. root = Tk()
  19. canvas = Canvas(root, width=MAX_WIDTH, height=MAX_HEIGHT, bg="white")
  20. selected_model = StringVar(root)
  21. selected_mapper = StringVar(root)
  22. mm_buttons = []
  23. available_models = model_list()
  24. available_mappers = []
  25. model_options = OptionMenu(root, selected_model, *[i[0] for i in available_models])
  26. mapper_options = OptionMenu(root, selected_mapper, "", *available_mappers)
  27. def visualize(model):
  28. print("Visualizing model: " + str(model))
  29. def reset_optionmenu(optionmenu, options, var):
  30. menu = optionmenu.children["menu"]
  31. menu.delete(0, "end")
  32. var.set("")
  33. for option in options:
  34. menu.add_command(label=option, command=lambda value=option: var.set(value))
  35. reset_optionmenu(mapper_options, [], selected_mapper)
  36. def read_available_mappers(instance_model):
  37. # Get instance model's type first, as transformations are defined on the type
  38. models = dict(model_list())
  39. type_model = models[instance_model]
  40. print("Found type model: " + type_model)
  41. print("Found MM_Rendered model: " + MM_RENDERED)
  42. # Switch to the core to find all information on megamodel relations
  43. model_modify("core")
  44. all_elems = [n for n, t in element_list() if t in ["Model", "ModelTransformation"]]
  45. all_attrs = {i: read_attrs(i) for i in all_elems}
  46. model_map = {all_attrs[i]["name"]: i for i in all_attrs}
  47. print("Got model_map: " + str(model_map))
  48. a = set([read_association_source(i) for i in read_incoming(model_map[MM_RENDERED], "transformOutput")])
  49. b = set([read_association_source(i) for i in read_incoming(model_map[type_model], "transformInput")])
  50. model_exit()
  51. print("All mappers for this tool: " + str(a))
  52. print("All transformations for this model: " + str(b))
  53. mappers = [all_attrs[i]["name"] for i in a & b]
  54. print("Overlap: " + str(mappers))
  55. return mappers
  56. class PromptDialog(tkSimpleDialog.Dialog):
  57. def __init__(self, master, query):
  58. self.query = query
  59. tkSimpleDialog.Dialog.__init__(self, master)
  60. def body(self, master):
  61. self.entries = []
  62. for i, q in enumerate(self.query):
  63. Label(master, text=q).grid(row=i, column=0)
  64. self.entries.append(Entry(master))
  65. self.entries[-1].grid(row=i, column=1)
  66. return self.entries[0]
  67. def apply(self):
  68. self.result = {self.query[i]: self.entries[i].get() for i in range(len(self.entries))}
  69. def create_element(t):
  70. def create_elem():
  71. print("Create element of type " + str(t))
  72. return create_elem
  73. def render_model():
  74. try:
  75. model_exit()
  76. except InvalidMode:
  77. pass
  78. rendered = model_render(selected_model.get(), selected_mapper.get())
  79. #TODO visualize rendered model
  80. print("Rendering model: " + rendered)
  81. import json
  82. visualize(json.loads(rendered))
  83. def open_model():
  84. try:
  85. model_exit()
  86. except InvalidMode:
  87. pass
  88. print("Opening model: " + selected_model.get())
  89. available_mappers = read_available_mappers(selected_model.get())
  90. reset_optionmenu(mapper_options, available_mappers, selected_mapper)
  91. model_modify(selected_model.get())
  92. print(types_full())
  93. available_types = [i[0] for i in types_full() if i[1] == "Class"]
  94. global mm_buttons
  95. for button in mm_buttons:
  96. button.destroy()
  97. mm_buttons = []
  98. for i, t in enumerate(available_types):
  99. mm_buttons.append(Button(root, text=t, command=lambda : create_element(t)))
  100. mm_buttons[-1].grid(row=1, column=i)
  101. def instantiate_model():
  102. try:
  103. model_exit()
  104. except InvalidMode:
  105. pass
  106. d = PromptDialog(root, ["Name:"])
  107. if d.result is not None:
  108. name = str(d.result["Name:"])
  109. print("Creating new model named " + name)
  110. model_add(name, selected_model.get())
  111. reset_optionmenu(available_models, model_list())
  112. selected_model.set(name)
  113. open_model()
  114. def verify_model():
  115. try:
  116. # Exit if necessary
  117. model_exit()
  118. except InvalidMode:
  119. pass
  120. print(verify(selected_model.get()))
  121. bound_functions = {
  122. "open": open_model,
  123. "render": render_model,
  124. "instantiate": instantiate_model,
  125. "verify": verify_model,
  126. }
  127. buttons = []
  128. buttons.append(model_options)
  129. buttons.append(mapper_options)
  130. for k, v in bound_functions.items():
  131. buttons.append(Button(root, text=k, command=v))
  132. for i, b in enumerate(buttons):
  133. b.grid(row=0, column=i)
  134. canvas.grid(row=2,column=0,columnspan=len(buttons))
  135. def left_clicked():
  136. pass
  137. def middle_clicked():
  138. pass
  139. def right_clicked():
  140. pass
  141. canvas.bind("<Button-1>", left_clicked)
  142. canvas.bind("<Button-2>", middle_clicked)
  143. canvas.bind("<Button-3>", right_clicked)
  144. root.mainloop()