render.alc 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. include "primitives.alh"
  2. include "modelling.alh"
  3. include "object_operations.alh"
  4. include "utils.alh"
  5. Boolean function main(model : Element):
  6. Element elements
  7. String class
  8. Element attrs
  9. Element attr_keys
  10. String attr_key
  11. String group
  12. String elem
  13. Integer loc
  14. Integer text_loc
  15. Element related_groups
  16. loc = 10
  17. Element groups
  18. groups = dict_create()
  19. elements = allInstances(model, "rendered/Group")
  20. while (set_len(elements) > 0):
  21. group = set_pop(elements)
  22. if (set_len(allIncomingAssociationInstances(model, group, "TracabilityClass")) == 0):
  23. Element to_remove
  24. String elem_to_remove
  25. to_remove = allAssociationDestinations(model, group, "rendered/contains")
  26. while (set_len(to_remove) > 0):
  27. elem_to_remove = set_pop(to_remove)
  28. if (read_type(model, elem_to_remove) == "rendered/Group"):
  29. set_add(to_remove, elem_to_remove)
  30. else:
  31. model_delete_element(model, elem_to_remove)
  32. model_delete_element(model, group)
  33. elements = allInstances(model, "abstract/Block")
  34. while (set_len(elements) > 0):
  35. class = set_pop(elements)
  36. Integer x
  37. Integer y
  38. x = loc
  39. y = 10
  40. // Check if there is already an associated element
  41. if (set_len(allOutgoingAssociationInstances(model, class, "TracabilityClass")) > 0):
  42. // Yes, but is it still clean?
  43. Boolean dirty
  44. dirty = False
  45. related_groups = allAssociationDestinations(model, class, "TracabilityClass")
  46. while (set_len(related_groups) > 0):
  47. group = set_pop(related_groups)
  48. if (value_eq(read_attribute(model, group, "dirty"), True)):
  49. // No, so mark all as dirty
  50. dirty = True
  51. break!
  52. else:
  53. // Yes, so just ignore this!
  54. continue!
  55. if (bool_not(dirty)):
  56. dict_add(groups, class, group)
  57. continue!
  58. else:
  59. related_groups = allAssociationDestinations(model, class, "TracabilityClass")
  60. Element to_remove
  61. String elem_to_remove
  62. while (set_len(related_groups) > 0):
  63. group = set_pop(related_groups)
  64. to_remove = allAssociationDestinations(model, group, "rendered/contains")
  65. x = create_value(read_attribute(model, group, "x"))
  66. y = create_value(read_attribute(model, group, "y"))
  67. while (set_len(to_remove) > 0):
  68. elem_to_remove = set_pop(to_remove)
  69. if (read_type(model, elem_to_remove) == "rendered/Group"):
  70. set_add(to_remove, elem_to_remove)
  71. else:
  72. model_delete_element(model, elem_to_remove)
  73. model_delete_element(model, group)
  74. attr_keys = dict_keys(getAttributeList(model, class))
  75. text_loc = 5
  76. group = instantiate_node(model, "rendered/Group", "")
  77. instantiate_attribute(model, group, "x", x)
  78. instantiate_attribute(model, group, "y", y)
  79. instantiate_attribute(model, group, "__asid", list_read(string_split_nr(class, "/", 1), 1))
  80. instantiate_attribute(model, group, "layer", 0)
  81. dict_add(groups, class, group)
  82. loc = loc + 100
  83. elem = instantiate_node(model, "rendered/Rectangle", "")
  84. instantiate_attribute(model, elem, "x", 0)
  85. instantiate_attribute(model, elem, "y", 0)
  86. instantiate_attribute(model, elem, "height", 50)
  87. instantiate_attribute(model, elem, "width", 50)
  88. instantiate_attribute(model, elem, "lineWidth", 4)
  89. instantiate_attribute(model, elem, "lineColour", "black")
  90. instantiate_attribute(model, elem, "fillColour", "white")
  91. instantiate_attribute(model, elem, "layer", 1)
  92. instantiate_link(model, "rendered/contains", "", group, elem)
  93. elem = instantiate_node(model, "rendered/Text", "")
  94. instantiate_attribute(model, elem, "x", 20)
  95. instantiate_attribute(model, elem, "y", 20)
  96. instantiate_attribute(model, elem, "lineWidth", 1)
  97. instantiate_attribute(model, elem, "lineColour", "black")
  98. String type
  99. type = read_type(model, class)
  100. if (type == "abstract/ConstantBlock"):
  101. if (element_neq(read_attribute(model, class, "value"), read_root())):
  102. instantiate_attribute(model, elem, "text", cast_string(read_attribute(model, class, "value")))
  103. else:
  104. instantiate_attribute(model, elem, "text", "?")
  105. elif (type == "abstract/AdditionBlock"):
  106. instantiate_attribute(model, elem, "text", "+")
  107. elif (type == "abstract/NegatorBlock"):
  108. instantiate_attribute(model, elem, "text", "-")
  109. elif (type == "abstract/MultiplyBlock"):
  110. instantiate_attribute(model, elem, "text", "X")
  111. elif (type == "abstract/InverseBlock"):
  112. instantiate_attribute(model, elem, "text", "1/x")
  113. elif (type == "abstract/DelayBlock"):
  114. instantiate_attribute(model, elem, "text", "DELAY")
  115. elif (type == "abstract/IntegratorBlock"):
  116. instantiate_attribute(model, elem, "text", "1/s")
  117. elif (type == "abstract/DerivatorBlock"):
  118. instantiate_attribute(model, elem, "text", "dx")
  119. elif (type == "abstract/ProbeBlock"):
  120. instantiate_attribute(model, elem, "text", "PROBE")
  121. instantiate_attribute(model, elem, "layer", 2)
  122. instantiate_link(model, "rendered/contains", "", group, elem)
  123. instantiate_link(model, "TracabilityClass", "", class, group)
  124. // Flush all associations
  125. elements = allInstances(model, "rendered/ConnectingLine")
  126. while (set_len(elements) > 0):
  127. class = set_pop(elements)
  128. model_delete_element(model, class)
  129. // Rerender associations
  130. elements = allInstances(model, "abstract/Link")
  131. while (set_len(elements) > 0):
  132. class = set_pop(elements)
  133. elem = instantiate_link(model, "rendered/ConnectingLine", "", groups[readAssociationSource(model, class)], groups[readAssociationDestination(model, class)])
  134. instantiate_attribute(model, elem, "offsetSourceX", 25)
  135. instantiate_attribute(model, elem, "offsetSourceY", 25)
  136. instantiate_attribute(model, elem, "offsetTargetX", 25)
  137. instantiate_attribute(model, elem, "offsetTargetY", 25)
  138. instantiate_attribute(model, elem, "lineWidth", 1)
  139. instantiate_attribute(model, elem, "lineColour", "black")
  140. instantiate_attribute(model, elem, "arrow", True)
  141. instantiate_attribute(model, elem, "__asid", list_read(string_split_nr(class, "/", 1), 1))
  142. instantiate_attribute(model, elem, "layer", 0)
  143. instantiate_link(model, "rendered/contains", "", group, elem)
  144. // Rerender initial conditions
  145. elements = allInstances(model, "abstract/InitialCondition")
  146. while (set_len(elements) > 0):
  147. class = set_pop(elements)
  148. elem = instantiate_link(model, "rendered/ConnectingLine", "", groups[readAssociationSource(model, class)], groups[readAssociationDestination(model, class)])
  149. instantiate_attribute(model, elem, "offsetSourceX", 25)
  150. instantiate_attribute(model, elem, "offsetSourceY", 25)
  151. instantiate_attribute(model, elem, "offsetTargetX", 25)
  152. instantiate_attribute(model, elem, "offsetTargetY", 25)
  153. instantiate_attribute(model, elem, "lineWidth", 1)
  154. instantiate_attribute(model, elem, "lineColour", "red")
  155. instantiate_attribute(model, elem, "arrow", True)
  156. instantiate_attribute(model, elem, "__asid", list_read(string_split_nr(class, "/", 1), 1))
  157. instantiate_attribute(model, elem, "layer", 0)
  158. instantiate_link(model, "rendered/contains", "", group, elem)
  159. return True!