render_OD.alc 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. include "primitives.alh"
  2. include "modelling.alh"
  3. include "object_operations.alh"
  4. Boolean function main(model : Element):
  5. Element elements
  6. String class
  7. Element attrs
  8. Element attr_keys
  9. String attr_key
  10. String group
  11. String elem
  12. Integer loc
  13. Integer text_loc
  14. loc = 10
  15. Element to_remove
  16. String elem_to_remove
  17. Element groups
  18. Element class_types
  19. Element metamodel
  20. metamodel = model["metamodel"]
  21. String class_type
  22. // Construct our own kind of tracability
  23. Element cs_to_as
  24. Element as_to_cs
  25. String asid
  26. cs_to_as = dict_create()
  27. as_to_cs = dict_create()
  28. groups = allInstances(model, "rendered/Group")
  29. while (set_len(groups) > 0):
  30. group = set_pop(groups)
  31. asid = read_attribute(model, group, "__asid")
  32. dict_add(cs_to_as, group, "abstract/" + asid)
  33. dict_add(as_to_cs, "abstract/" + asid, group)
  34. // Now render everything
  35. groups = dict_create()
  36. class_types = allInstances(metamodel, "Class")
  37. while (set_len(class_types) > 0):
  38. class_type = set_pop(class_types)
  39. elements = allInstances(model, class_type)
  40. while (set_len(elements) > 0):
  41. class = set_pop(elements)
  42. Integer x
  43. Integer y
  44. x = loc
  45. y = 10
  46. // Check if there is already an associated element
  47. if (dict_in(as_to_cs, class)):
  48. // Yes, but is it still clean?
  49. Element related_groups
  50. Boolean dirty
  51. dirty = False
  52. related_groups = as_to_cs[class]
  53. while (set_len(related_groups) > 0):
  54. group = set_pop(related_groups)
  55. if (value_eq(read_attribute(model, group, "dirty"), True)):
  56. // No, so mark all as dirty
  57. dirty = True
  58. break!
  59. else:
  60. // Yes, so just ignore this!
  61. continue!
  62. if (bool_not(dirty)):
  63. dict_add(groups, class, group)
  64. continue!
  65. else:
  66. group = as_to_cs[class]
  67. group = set_pop(related_groups)
  68. to_remove = allAssociationDestinations(model, group, "rendered/contains")
  69. x = create_value(read_attribute(model, group, "x"))
  70. y = create_value(read_attribute(model, group, "y"))
  71. while (set_len(to_remove) > 0):
  72. elem_to_remove = set_pop(to_remove)
  73. if (read_type(model, elem_to_remove) == "rendered/Group"):
  74. set_add(to_remove, elem_to_remove)
  75. else:
  76. model_delete_element(model, elem_to_remove)
  77. model_delete_element(model, group)
  78. attr_keys = dict_keys(getAttributeList(model, class))
  79. text_loc = 5
  80. group = instantiate_node(model, "rendered/Group", "")
  81. instantiate_attribute(model, group, "x", x)
  82. instantiate_attribute(model, group, "y", y)
  83. instantiate_attribute(model, group, "__asid", list_read(string_split(class, "/"), 1))
  84. dict_add(groups, class, group)
  85. loc = loc + 200
  86. elem = instantiate_node(model, "rendered/Rectangle", "")
  87. instantiate_attribute(model, elem, "x", 0)
  88. instantiate_attribute(model, elem, "y", 0)
  89. instantiate_attribute(model, elem, "height", 40 + set_len(getAttributeList(model, class)) * 20)
  90. instantiate_attribute(model, elem, "width", 150)
  91. instantiate_attribute(model, elem, "lineWidth", 2)
  92. instantiate_attribute(model, elem, "lineColour", "black")
  93. instantiate_attribute(model, elem, "fillColour", "white")
  94. instantiate_link(model, "rendered/contains", "", group, elem)
  95. elem = instantiate_node(model, "rendered/Text", "")
  96. instantiate_attribute(model, elem, "x", 5)
  97. instantiate_attribute(model, elem, "y", 3)
  98. instantiate_attribute(model, elem, "lineWidth", 1)
  99. instantiate_attribute(model, elem, "lineColour", "black")
  100. instantiate_attribute(model, elem, "text", string_join(class, " : " + cast_v2s(list_read(string_split(read_type(model, class), "/"), 1))))
  101. instantiate_link(model, "rendered/contains", "", group, elem)
  102. elem = instantiate_node(model, "rendered/Line", "")
  103. instantiate_attribute(model, elem, "x", 0)
  104. instantiate_attribute(model, elem, "y", 20)
  105. instantiate_attribute(model, elem, "targetX", 150)
  106. instantiate_attribute(model, elem, "targetY", 20)
  107. instantiate_attribute(model, elem, "lineWidth", 1)
  108. instantiate_attribute(model, elem, "lineColour", "black")
  109. instantiate_attribute(model, elem, "arrow", False)
  110. instantiate_link(model, "rendered/contains", "", group, elem)
  111. attrs = getAttributeList(model, class)
  112. attr_keys = dict_keys(attrs)
  113. while (dict_len(attr_keys) > 0):
  114. attr_key = set_pop(attr_keys)
  115. elem = instantiate_node(model, "rendered/Text", "")
  116. instantiate_attribute(model, elem, "x", 5)
  117. instantiate_attribute(model, elem, "y", text_loc + 20)
  118. instantiate_attribute(model, elem, "lineWidth", 1)
  119. instantiate_attribute(model, elem, "lineColour", "black")
  120. instantiate_attribute(model, elem, "text", (attr_key + " = ") + cast_v2s(list_read(string_split(attrs[attr_key], "/"), 1)))
  121. instantiate_link(model, "rendered/contains", "", group, elem)
  122. text_loc = text_loc + 15
  123. // Flush all associations
  124. elements = allInstances(model, "rendered/ConnectingLine")
  125. while (set_len(elements) > 0):
  126. class = set_pop(elements)
  127. model_delete_element(model, class)
  128. // Rerender associations
  129. class_types = allInstances(metamodel, "Association")
  130. while (set_len(class_types) > 0):
  131. class_type = set_pop(class_types)
  132. elements = allInstances(model, "abstract/Association")
  133. while (set_len(elements) > 0):
  134. class = set_pop(elements)
  135. attr_keys = dict_keys(getAttributeList(model, class))
  136. elem = instantiate_link(model, "rendered/ConnectingLine", "", groups[readAssociationSource(model, class)], groups[readAssociationDestination(model, class)])
  137. instantiate_attribute(model, elem, "offsetSourceX", 0)
  138. instantiate_attribute(model, elem, "offsetSourceY", 0)
  139. instantiate_attribute(model, elem, "offsetTargetX", 0)
  140. instantiate_attribute(model, elem, "offsetTargetY", 0)
  141. instantiate_attribute(model, elem, "lineWidth", 1)
  142. instantiate_attribute(model, elem, "lineColour", "black")
  143. instantiate_attribute(model, elem, "arrow", True)
  144. instantiate_attribute(model, elem, "__asid", list_read(string_split(class, "/"), 1))
  145. instantiate_link(model, "rendered/contains", "", group, elem)
  146. return True!