|
@@ -0,0 +1,180 @@
|
|
|
|
+include "primitives.alh"
|
|
|
|
+include "modelling.alh"
|
|
|
|
+include "object_operations.alh"
|
|
|
|
+include "utils.alh"
|
|
|
|
+
|
|
|
|
+Boolean function main(model : Element):
|
|
|
|
+ Element elements
|
|
|
|
+ String class
|
|
|
|
+ Element attrs
|
|
|
|
+ Element attr_keys
|
|
|
|
+ String attr_key
|
|
|
|
+ String group
|
|
|
|
+ String elem
|
|
|
|
+ Integer loc
|
|
|
|
+ Integer text_loc
|
|
|
|
+ Element related_groups
|
|
|
|
+ loc = 10
|
|
|
|
+
|
|
|
|
+ Element groups
|
|
|
|
+ groups = dict_create()
|
|
|
|
+
|
|
|
|
+ elements = allInstances(model, "rendered/Group")
|
|
|
|
+ while (set_len(elements) > 0):
|
|
|
|
+ group = set_pop(elements)
|
|
|
|
+ if (set_len(allIncomingAssociationInstances(model, group, "TracabilityClass")) == 0):
|
|
|
|
+ Element to_remove
|
|
|
|
+ String elem_to_remove
|
|
|
|
+ to_remove = allAssociationDestinations(model, group, "rendered/contains")
|
|
|
|
+ while (set_len(to_remove) > 0):
|
|
|
|
+ elem_to_remove = set_pop(to_remove)
|
|
|
|
+ if (read_type(model, elem_to_remove) == "rendered/Group"):
|
|
|
|
+ set_add(to_remove, elem_to_remove)
|
|
|
|
+ else:
|
|
|
|
+ model_delete_element(model, elem_to_remove)
|
|
|
|
+ model_delete_element(model, group)
|
|
|
|
+
|
|
|
|
+ elements = allInstances(model, "abstract/Block")
|
|
|
|
+ while (set_len(elements) > 0):
|
|
|
|
+ class = set_pop(elements)
|
|
|
|
+
|
|
|
|
+ Integer x
|
|
|
|
+ Integer y
|
|
|
|
+ x = loc
|
|
|
|
+ y = 10
|
|
|
|
+
|
|
|
|
+ // Check if there is already an associated element
|
|
|
|
+ if (set_len(allOutgoingAssociationInstances(model, class, "TracabilityClass")) > 0):
|
|
|
|
+ // Yes, but is it still clean?
|
|
|
|
+ Boolean dirty
|
|
|
|
+ dirty = False
|
|
|
|
+
|
|
|
|
+ related_groups = allAssociationDestinations(model, class, "TracabilityClass")
|
|
|
|
+ while (set_len(related_groups) > 0):
|
|
|
|
+ group = set_pop(related_groups)
|
|
|
|
+ if (value_eq(read_attribute(model, group, "dirty"), True)):
|
|
|
|
+ // No, so mark all as dirty
|
|
|
|
+ dirty = True
|
|
|
|
+ break!
|
|
|
|
+ else:
|
|
|
|
+ // Yes, so just ignore this!
|
|
|
|
+ continue!
|
|
|
|
+
|
|
|
|
+ if (bool_not(dirty)):
|
|
|
|
+ dict_add(groups, class, group)
|
|
|
|
+ continue!
|
|
|
|
+ else:
|
|
|
|
+ related_groups = allAssociationDestinations(model, class, "TracabilityClass")
|
|
|
|
+ Element to_remove
|
|
|
|
+ String elem_to_remove
|
|
|
|
+ while (set_len(related_groups) > 0):
|
|
|
|
+ group = set_pop(related_groups)
|
|
|
|
+ to_remove = allAssociationDestinations(model, group, "rendered/contains")
|
|
|
|
+ x = create_value(read_attribute(model, group, "x"))
|
|
|
|
+ y = create_value(read_attribute(model, group, "y"))
|
|
|
|
+ while (set_len(to_remove) > 0):
|
|
|
|
+ elem_to_remove = set_pop(to_remove)
|
|
|
|
+ if (read_type(model, elem_to_remove) == "rendered/Group"):
|
|
|
|
+ set_add(to_remove, elem_to_remove)
|
|
|
|
+ else:
|
|
|
|
+ model_delete_element(model, elem_to_remove)
|
|
|
|
+ model_delete_element(model, group)
|
|
|
|
+
|
|
|
|
+ attr_keys = dict_keys(getAttributeList(model, class))
|
|
|
|
+ text_loc = 5
|
|
|
|
+
|
|
|
|
+ group = instantiate_node(model, "rendered/Group", "")
|
|
|
|
+ instantiate_attribute(model, group, "x", x)
|
|
|
|
+ instantiate_attribute(model, group, "y", y)
|
|
|
|
+ instantiate_attribute(model, group, "__asid", list_read(string_split_nr(class, "/", 1), 1))
|
|
|
|
+ instantiate_attribute(model, group, "layer", 0)
|
|
|
|
+ dict_add(groups, class, group)
|
|
|
|
+ loc = loc + 100
|
|
|
|
+
|
|
|
|
+ elem = instantiate_node(model, "rendered/Rectangle", "")
|
|
|
|
+ instantiate_attribute(model, elem, "x", 0)
|
|
|
|
+ instantiate_attribute(model, elem, "y", 0)
|
|
|
|
+ instantiate_attribute(model, elem, "height", 50)
|
|
|
|
+ instantiate_attribute(model, elem, "width", 50)
|
|
|
|
+ instantiate_attribute(model, elem, "lineWidth", 4)
|
|
|
|
+ instantiate_attribute(model, elem, "lineColour", "black")
|
|
|
|
+ instantiate_attribute(model, elem, "fillColour", "white")
|
|
|
|
+ instantiate_attribute(model, elem, "layer", 1)
|
|
|
|
+ instantiate_link(model, "rendered/contains", "", group, elem)
|
|
|
|
+
|
|
|
|
+ elem = instantiate_node(model, "rendered/Text", "")
|
|
|
|
+ instantiate_attribute(model, elem, "x", 20)
|
|
|
|
+ instantiate_attribute(model, elem, "y", 20)
|
|
|
|
+ instantiate_attribute(model, elem, "lineWidth", 1)
|
|
|
|
+ instantiate_attribute(model, elem, "lineColour", "black")
|
|
|
|
+
|
|
|
|
+ String type
|
|
|
|
+ type = read_type(model, class)
|
|
|
|
+ if (type == "abstract/ConstantBlock"):
|
|
|
|
+ if (element_neq(read_attribute(model, class, "value"), read_root())):
|
|
|
|
+ instantiate_attribute(model, elem, "text", cast_string(read_attribute(model, class, "value")))
|
|
|
|
+ else:
|
|
|
|
+ instantiate_attribute(model, elem, "text", "?")
|
|
|
|
+ elif (type == "abstract/AdditionBlock"):
|
|
|
|
+ instantiate_attribute(model, elem, "text", "+")
|
|
|
|
+ elif (type == "abstract/NegatorBlock"):
|
|
|
|
+ instantiate_attribute(model, elem, "text", "-")
|
|
|
|
+ elif (type == "abstract/MultiplyBlock"):
|
|
|
|
+ instantiate_attribute(model, elem, "text", "X")
|
|
|
|
+ elif (type == "abstract/InverseBlock"):
|
|
|
|
+ instantiate_attribute(model, elem, "text", "1/x")
|
|
|
|
+ elif (type == "abstract/DelayBlock"):
|
|
|
|
+ instantiate_attribute(model, elem, "text", "DELAY")
|
|
|
|
+ elif (type == "abstract/IntegratorBlock"):
|
|
|
|
+ instantiate_attribute(model, elem, "text", "1/s")
|
|
|
|
+ elif (type == "abstract/DerivatorBlock"):
|
|
|
|
+ instantiate_attribute(model, elem, "text", "dx")
|
|
|
|
+ elif (type == "abstract/ProbeBlock"):
|
|
|
|
+ instantiate_attribute(model, elem, "text", "PROBE")
|
|
|
|
+
|
|
|
|
+ instantiate_attribute(model, elem, "layer", 2)
|
|
|
|
+ instantiate_link(model, "rendered/contains", "", group, elem)
|
|
|
|
+
|
|
|
|
+ instantiate_link(model, "TracabilityClass", "", class, group)
|
|
|
|
+
|
|
|
|
+ // Flush all associations
|
|
|
|
+ elements = allInstances(model, "rendered/ConnectingLine")
|
|
|
|
+ while (set_len(elements) > 0):
|
|
|
|
+ class = set_pop(elements)
|
|
|
|
+ model_delete_element(model, class)
|
|
|
|
+
|
|
|
|
+ // Rerender associations
|
|
|
|
+ elements = allInstances(model, "abstract/Link")
|
|
|
|
+ while (set_len(elements) > 0):
|
|
|
|
+ class = set_pop(elements)
|
|
|
|
+
|
|
|
|
+ elem = instantiate_link(model, "rendered/ConnectingLine", "", groups[readAssociationSource(model, class)], groups[readAssociationDestination(model, class)])
|
|
|
|
+ instantiate_attribute(model, elem, "offsetSourceX", 25)
|
|
|
|
+ instantiate_attribute(model, elem, "offsetSourceY", 25)
|
|
|
|
+ instantiate_attribute(model, elem, "offsetTargetX", 25)
|
|
|
|
+ instantiate_attribute(model, elem, "offsetTargetY", 25)
|
|
|
|
+ instantiate_attribute(model, elem, "lineWidth", 1)
|
|
|
|
+ instantiate_attribute(model, elem, "lineColour", "black")
|
|
|
|
+ instantiate_attribute(model, elem, "arrow", True)
|
|
|
|
+ instantiate_attribute(model, elem, "__asid", list_read(string_split_nr(class, "/", 1), 1))
|
|
|
|
+ instantiate_attribute(model, elem, "layer", 0)
|
|
|
|
+ instantiate_link(model, "rendered/contains", "", group, elem)
|
|
|
|
+
|
|
|
|
+ // Rerender initial conditions
|
|
|
|
+ elements = allInstances(model, "abstract/InitialCondition")
|
|
|
|
+ while (set_len(elements) > 0):
|
|
|
|
+ class = set_pop(elements)
|
|
|
|
+
|
|
|
|
+ elem = instantiate_link(model, "rendered/ConnectingLine", "", groups[readAssociationSource(model, class)], groups[readAssociationDestination(model, class)])
|
|
|
|
+ instantiate_attribute(model, elem, "offsetSourceX", 25)
|
|
|
|
+ instantiate_attribute(model, elem, "offsetSourceY", 25)
|
|
|
|
+ instantiate_attribute(model, elem, "offsetTargetX", 25)
|
|
|
|
+ instantiate_attribute(model, elem, "offsetTargetY", 25)
|
|
|
|
+ instantiate_attribute(model, elem, "lineWidth", 1)
|
|
|
|
+ instantiate_attribute(model, elem, "lineColour", "red")
|
|
|
|
+ instantiate_attribute(model, elem, "arrow", True)
|
|
|
|
+ instantiate_attribute(model, elem, "__asid", list_read(string_split_nr(class, "/", 1), 1))
|
|
|
|
+ instantiate_attribute(model, elem, "layer", 0)
|
|
|
|
+ instantiate_link(model, "rendered/contains", "", group, elem)
|
|
|
|
+
|
|
|
|
+ return True!
|