render_SCD.alc 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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. Element related_groups
  15. loc = 10
  16. Element groups
  17. groups = dict_create()
  18. elements = allInstances(model, "rendered/Group")
  19. while (set_len(elements) > 0):
  20. group = set_pop(elements)
  21. if (set_len(allIncomingAssociationInstances(model, group, "TracabilityClass")) == 0):
  22. Element to_remove
  23. String elem_to_remove
  24. to_remove = allAssociationDestinations(model, group, "rendered/contains")
  25. while (set_len(to_remove) > 0):
  26. elem_to_remove = set_pop(to_remove)
  27. if (read_type(model, elem_to_remove) == "rendered/Group"):
  28. set_add(to_remove, elem_to_remove)
  29. else:
  30. model_delete_element(model, elem_to_remove)
  31. model_delete_element(model, group)
  32. elements = allInstances(model, "abstract/Class")
  33. while (set_len(elements) > 0):
  34. class = set_pop(elements)
  35. Integer x
  36. Integer y
  37. x = loc
  38. y = 10
  39. // Check if there is already an associated element
  40. if (set_len(allOutgoingAssociationInstances(model, class, "TracabilityClass")) > 0):
  41. // Yes, but is it still clean?
  42. Boolean dirty
  43. dirty = False
  44. related_groups = allAssociationDestinations(model, class, "TracabilityClass")
  45. while (set_len(related_groups) > 0):
  46. group = set_pop(related_groups)
  47. if (value_eq(read_attribute(model, group, "dirty"), True)):
  48. // No, so mark all as dirty
  49. dirty = True
  50. break!
  51. else:
  52. // Yes, so just ignore this!
  53. continue!
  54. if (bool_not(dirty)):
  55. dict_add(groups, class, group)
  56. continue!
  57. else:
  58. related_groups = allAssociationDestinations(model, class, "TracabilityClass")
  59. Element to_remove
  60. String elem_to_remove
  61. while (set_len(related_groups) > 0):
  62. group = set_pop(related_groups)
  63. to_remove = allAssociationDestinations(model, group, "rendered/contains")
  64. x = create_value(read_attribute(model, group, "x"))
  65. y = create_value(read_attribute(model, group, "y"))
  66. while (set_len(to_remove) > 0):
  67. elem_to_remove = set_pop(to_remove)
  68. if (read_type(model, elem_to_remove) == "rendered/Group"):
  69. set_add(to_remove, elem_to_remove)
  70. else:
  71. model_delete_element(model, elem_to_remove)
  72. model_delete_element(model, group)
  73. attr_keys = dict_keys(getAttributeList(model, class))
  74. text_loc = 5
  75. group = instantiate_node(model, "rendered/Group", "")
  76. instantiate_attribute(model, group, "x", x)
  77. instantiate_attribute(model, group, "y", y)
  78. instantiate_attribute(model, group, "__asid", list_read(string_split(class, "/"), 1))
  79. instantiate_attribute(model, group, "layer", 0)
  80. dict_add(groups, class, group)
  81. loc = loc + 200
  82. elem = instantiate_node(model, "rendered/Rectangle", "")
  83. instantiate_attribute(model, elem, "x", 0)
  84. instantiate_attribute(model, elem, "y", 0)
  85. instantiate_attribute(model, elem, "height", 40 + set_len(getInstantiatableAttributes(model, class, "abstract/AttributeLink")) * 20)
  86. instantiate_attribute(model, elem, "width", 150)
  87. instantiate_attribute(model, elem, "lineWidth", 2)
  88. instantiate_attribute(model, elem, "lineColour", "black")
  89. instantiate_attribute(model, elem, "fillColour", "white")
  90. instantiate_attribute(model, elem, "layer", 1)
  91. instantiate_link(model, "rendered/contains", "", group, elem)
  92. String multiplicities
  93. String lower_card
  94. String upper_card
  95. if (element_eq(read_attribute(model, class, "lower_cardinality"), read_root())):
  96. lower_card = "*"
  97. else:
  98. lower_card = cast_value(read_attribute(model, class, "lower_cardinality"))
  99. if (element_eq(read_attribute(model, class, "upper_cardinality"), read_root())):
  100. upper_card = "*"
  101. else:
  102. upper_card = cast_value(read_attribute(model, class, "upper_cardinality"))
  103. multiplicities = ((("[" + lower_card) + "..") + upper_card) + "]"
  104. elem = instantiate_node(model, "rendered/Text", "")
  105. instantiate_attribute(model, elem, "x", 5)
  106. instantiate_attribute(model, elem, "y", 3)
  107. instantiate_attribute(model, elem, "lineWidth", 1)
  108. instantiate_attribute(model, elem, "lineColour", "black")
  109. if (element_neq(read_attribute(model, class, "name"), read_root())):
  110. instantiate_attribute(model, elem, "text", string_join(read_attribute(model, class, "name"), " " + multiplicities))
  111. else:
  112. instantiate_attribute(model, elem, "text", "(unnamed) " + multiplicities)
  113. instantiate_attribute(model, elem, "layer", 2)
  114. instantiate_link(model, "rendered/contains", "", group, elem)
  115. elem = instantiate_node(model, "rendered/Line", "")
  116. instantiate_attribute(model, elem, "x", 0)
  117. instantiate_attribute(model, elem, "y", 20)
  118. instantiate_attribute(model, elem, "targetX", 150)
  119. instantiate_attribute(model, elem, "targetY", 20)
  120. instantiate_attribute(model, elem, "lineWidth", 1)
  121. instantiate_attribute(model, elem, "lineColour", "black")
  122. instantiate_attribute(model, elem, "arrow", False)
  123. instantiate_attribute(model, elem, "layer", 2)
  124. instantiate_link(model, "rendered/contains", "", group, elem)
  125. attrs = getInstantiatableAttributes(model, class, "abstract/AttributeLink")
  126. attr_keys = dict_keys(attrs)
  127. while (dict_len(attr_keys) > 0):
  128. attr_key = set_pop(attr_keys)
  129. elem = instantiate_node(model, "rendered/Text", "")
  130. instantiate_attribute(model, elem, "x", 5)
  131. instantiate_attribute(model, elem, "y", text_loc + 20)
  132. instantiate_attribute(model, elem, "lineWidth", 1)
  133. instantiate_attribute(model, elem, "lineColour", "black")
  134. instantiate_attribute(model, elem, "text", (attr_key + " : ") + cast_string(list_read(string_split(attrs[attr_key], "/"), 1)))
  135. instantiate_attribute(model, elem, "layer", 2)
  136. instantiate_link(model, "rendered/contains", "", group, elem)
  137. text_loc = text_loc + 15
  138. instantiate_link(model, "TracabilityClass", "", class, group)
  139. // Flush all associations
  140. elements = allInstances(model, "rendered/ConnectingLine")
  141. while (set_len(elements) > 0):
  142. class = set_pop(elements)
  143. model_delete_element(model, class)
  144. // Rerender associations
  145. elements = allInstances(model, "abstract/Association")
  146. while (set_len(elements) > 0):
  147. class = set_pop(elements)
  148. attr_keys = dict_keys(getAttributeList(model, class))
  149. elem = instantiate_link(model, "rendered/ConnectingLine", "", groups[readAssociationSource(model, class)], groups[readAssociationDestination(model, class)])
  150. instantiate_attribute(model, elem, "offsetSourceX", 75)
  151. instantiate_attribute(model, elem, "offsetSourceY", 30)
  152. instantiate_attribute(model, elem, "offsetTargetX", 75)
  153. instantiate_attribute(model, elem, "offsetTargetY", 30)
  154. instantiate_attribute(model, elem, "lineWidth", 1)
  155. instantiate_attribute(model, elem, "lineColour", "black")
  156. instantiate_attribute(model, elem, "arrow", True)
  157. instantiate_attribute(model, elem, "__asid", list_read(string_split(class, "/"), 1))
  158. instantiate_attribute(model, elem, "layer", 0)
  159. log("Found ASID " + cast_value(list_read(string_split(class, "/"), 1)))
  160. instantiate_link(model, "rendered/contains", "", group, elem)
  161. return True!