Ver código fonte

Nicer way of visualizing SimpleAttributes

Yentl Van Tendeloo 7 anos atrás
pai
commit
b48b61ea49
2 arquivos alterados com 111 adições e 37 exclusões
  1. 31 4
      classes/window/main_window.xml
  2. 80 33
      frontend.py

+ 31 - 4
classes/window/main_window.xml

@@ -1117,6 +1117,18 @@
                                     groups = {}
                                     edges = []
 
+                                    defined_attributes = {}
+                                    names = {}
+                                    if current_metamodel == "formalisms/SimpleClassDiagrams":
+                                        for elem in result:
+                                            if elem["__type"] == "AttributeLink":
+                                                defined_attributes.setdefault(elem["__source"], []).append((elem["name"], elem["__target"], True if elem["optional"] == True else False))
+                                            if "name" in elem:
+                                                names[elem["__id"]] = elem["name"]
+
+                                    print("Got defined attributes: " + str(defined_attributes))
+                                    print("Got names: " + str(names))
+                                                
                                     for elem in list(result):
                                         is_edge = False
                                         attrs = {}
@@ -1141,9 +1153,10 @@
                                             edge_edge = False
 
                                         if is_edge:
-                                            cs_elem_id = str(uuid.uuid4())
-                                            edges.append({"id": cs_elem_id, "type": "ConnectingLine", "offsetSourceX": 0 if edge_edge else 100, "offsetSourceY": 0 if edge_edge else 30, "offsetTargetX": 100, "offsetTargetY": 30, "lineWidth": 3, "lineColour": "black", "arrow": True, "__asid": element_id, "layer": 0, "__source": element_source, "__target": element_target})
-                                            groups[element_id] = cs_elem_id
+                                            if not (elem["__type"] == "AttributeLink" and current_metamodel == "formalisms/SimpleClassDiagrams"):
+                                                cs_elem_id = str(uuid.uuid4())
+                                                edges.append({"id": cs_elem_id, "type": "ConnectingLine", "offsetSourceX": 0 if edge_edge else 100, "offsetSourceY": 0 if edge_edge else 30, "offsetTargetX": 100, "offsetTargetY": 30, "lineWidth": 3, "lineColour": "black", "arrow": True, "__asid": element_id, "layer": 0, "__source": element_source, "__target": element_target})
+                                                groups[element_id] = cs_elem_id
                                         else:
                                             # Add the group
                                             x, y = self.locations.get(element_id, (30 + (group_counter * 250) % 1000, 30 + ((group_counter / 4) * 250)))
@@ -1160,7 +1173,21 @@
                                             self.rendered.append({"id": str(uuid.uuid4()), "type": "contains", "__source": group_id, "__target": cs_elem_id})
                                             max_text = max(len("%s : %s" % (element_id, element_type)), max_text)
                                             # Then the attributes
-                                            text_counter = 0
+                                            text_counter = 1
+
+                                            for name, attr_type, optional in defined_attributes.get(elem["__id"], []):
+                                                cs_elem_id = str(uuid.uuid4())
+                                                text = "%s : %s" % (name, names.get(attr_type, "(%s)" % attr_type))
+                                                if optional:
+                                                    text = text.replace(" : ", " ?: ")
+                                                self.rendered.append({"id": cs_elem_id, "type": "Text", "x": 10, "y": 25 + text_counter * 11, "text": text, "lineWidth": 3, "lineColour": "black", "layer": 2})
+                                                max_text = max(len(text), max_text)
+                                                self.rendered.append({"id": str(uuid.uuid4()), "type": "contains", "__source": group_id, "__target": cs_elem_id})
+                                                text_counter += 1
+
+                                            if text_counter > 1:
+                                                text_counter += 1
+
                                             for key, value in attrs.items():
                                                 cs_elem_id = str(uuid.uuid4())
                                                 if isinstance(value, dict):

+ 80 - 33
frontend.py

@@ -4457,6 +4457,7 @@ class AttributeEditor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.associations_optional = {}
         self.associations_delete = {}
         self.dirty = None
+        self.name_to_id = {}
     
     def user_defined_destructor(self):
         self.destroy()
@@ -4518,98 +4519,102 @@ class AttributeEditor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/all/init/create_entries/create_entry"].setEnter(self._all_init_create_entries_create_entry_enter)
         self.states["/all/init/create_entries/create_entry"].setExit(self._all_init_create_entries_create_entry_exit)
         
+        # state /all/init/create_entries/create_entry/resolve_entry
+        self.states["/all/init/create_entries/create_entry/resolve_entry"] = State(11, "/all/init/create_entries/create_entry/resolve_entry", self)
+        self.states["/all/init/create_entries/create_entry/resolve_entry"].setEnter(self._all_init_create_entries_create_entry_resolve_entry_enter)
+        
         # state /all/init/create_entries/create_entry/name_entry
-        self.states["/all/init/create_entries/create_entry/name_entry"] = State(11, "/all/init/create_entries/create_entry/name_entry", self)
+        self.states["/all/init/create_entries/create_entry/name_entry"] = State(12, "/all/init/create_entries/create_entry/name_entry", self)
         
         # state /all/init/create_entries/create_entry/name_entry/create
-        self.states["/all/init/create_entries/create_entry/name_entry/create"] = State(12, "/all/init/create_entries/create_entry/name_entry/create", self)
+        self.states["/all/init/create_entries/create_entry/name_entry/create"] = State(13, "/all/init/create_entries/create_entry/name_entry/create", self)
         self.states["/all/init/create_entries/create_entry/name_entry/create"].setEnter(self._all_init_create_entries_create_entry_name_entry_create_enter)
         
         # state /all/init/create_entries/create_entry/name_entry/pack
-        self.states["/all/init/create_entries/create_entry/name_entry/pack"] = State(13, "/all/init/create_entries/create_entry/name_entry/pack", self)
+        self.states["/all/init/create_entries/create_entry/name_entry/pack"] = State(14, "/all/init/create_entries/create_entry/name_entry/pack", self)
         
         # state /all/init/create_entries/create_entry/type_dropdown
-        self.states["/all/init/create_entries/create_entry/type_dropdown"] = State(14, "/all/init/create_entries/create_entry/type_dropdown", self)
+        self.states["/all/init/create_entries/create_entry/type_dropdown"] = State(15, "/all/init/create_entries/create_entry/type_dropdown", self)
         
         # state /all/init/create_entries/create_entry/type_dropdown/create
-        self.states["/all/init/create_entries/create_entry/type_dropdown/create"] = State(15, "/all/init/create_entries/create_entry/type_dropdown/create", self)
+        self.states["/all/init/create_entries/create_entry/type_dropdown/create"] = State(16, "/all/init/create_entries/create_entry/type_dropdown/create", self)
         self.states["/all/init/create_entries/create_entry/type_dropdown/create"].setEnter(self._all_init_create_entries_create_entry_type_dropdown_create_enter)
         
         # state /all/init/create_entries/create_entry/type_dropdown/pack
-        self.states["/all/init/create_entries/create_entry/type_dropdown/pack"] = State(16, "/all/init/create_entries/create_entry/type_dropdown/pack", self)
+        self.states["/all/init/create_entries/create_entry/type_dropdown/pack"] = State(17, "/all/init/create_entries/create_entry/type_dropdown/pack", self)
         
         # state /all/init/create_entries/create_entry/optional_button
-        self.states["/all/init/create_entries/create_entry/optional_button"] = State(17, "/all/init/create_entries/create_entry/optional_button", self)
+        self.states["/all/init/create_entries/create_entry/optional_button"] = State(18, "/all/init/create_entries/create_entry/optional_button", self)
         
         # state /all/init/create_entries/create_entry/optional_button/create
-        self.states["/all/init/create_entries/create_entry/optional_button/create"] = State(18, "/all/init/create_entries/create_entry/optional_button/create", self)
+        self.states["/all/init/create_entries/create_entry/optional_button/create"] = State(19, "/all/init/create_entries/create_entry/optional_button/create", self)
         self.states["/all/init/create_entries/create_entry/optional_button/create"].setEnter(self._all_init_create_entries_create_entry_optional_button_create_enter)
         
         # state /all/init/create_entries/create_entry/optional_button/pack
-        self.states["/all/init/create_entries/create_entry/optional_button/pack"] = State(19, "/all/init/create_entries/create_entry/optional_button/pack", self)
+        self.states["/all/init/create_entries/create_entry/optional_button/pack"] = State(20, "/all/init/create_entries/create_entry/optional_button/pack", self)
         
         # state /all/init/create_entries/create_entry/delete_button
-        self.states["/all/init/create_entries/create_entry/delete_button"] = State(20, "/all/init/create_entries/create_entry/delete_button", self)
+        self.states["/all/init/create_entries/create_entry/delete_button"] = State(21, "/all/init/create_entries/create_entry/delete_button", self)
         
         # state /all/init/create_entries/create_entry/delete_button/create
-        self.states["/all/init/create_entries/create_entry/delete_button/create"] = State(21, "/all/init/create_entries/create_entry/delete_button/create", self)
+        self.states["/all/init/create_entries/create_entry/delete_button/create"] = State(22, "/all/init/create_entries/create_entry/delete_button/create", self)
         self.states["/all/init/create_entries/create_entry/delete_button/create"].setEnter(self._all_init_create_entries_create_entry_delete_button_create_enter)
         
         # state /all/init/create_entries/create_entry/delete_button/pack
-        self.states["/all/init/create_entries/create_entry/delete_button/pack"] = State(22, "/all/init/create_entries/create_entry/delete_button/pack", self)
+        self.states["/all/init/create_entries/create_entry/delete_button/pack"] = State(23, "/all/init/create_entries/create_entry/delete_button/pack", self)
         
         # state /all/init/add_new_attribute
-        self.states["/all/init/add_new_attribute"] = State(23, "/all/init/add_new_attribute", self)
+        self.states["/all/init/add_new_attribute"] = State(24, "/all/init/add_new_attribute", self)
         
         # state /all/init/add_new_attribute/create
-        self.states["/all/init/add_new_attribute/create"] = State(24, "/all/init/add_new_attribute/create", self)
+        self.states["/all/init/add_new_attribute/create"] = State(25, "/all/init/add_new_attribute/create", self)
         self.states["/all/init/add_new_attribute/create"].setEnter(self._all_init_add_new_attribute_create_enter)
         
         # state /all/init/add_new_attribute/pack
-        self.states["/all/init/add_new_attribute/pack"] = State(25, "/all/init/add_new_attribute/pack", self)
+        self.states["/all/init/add_new_attribute/pack"] = State(26, "/all/init/add_new_attribute/pack", self)
         
         # state /all/running
-        self.states["/all/running"] = State(26, "/all/running", self)
+        self.states["/all/running"] = State(27, "/all/running", self)
         
         # state /all/change_type
-        self.states["/all/change_type"] = State(27, "/all/change_type", self)
+        self.states["/all/change_type"] = State(28, "/all/change_type", self)
         self.states["/all/change_type"].setEnter(self._all_change_type_enter)
         
         # state /all/change_name
-        self.states["/all/change_name"] = State(28, "/all/change_name", self)
+        self.states["/all/change_name"] = State(29, "/all/change_name", self)
         self.states["/all/change_name"].setEnter(self._all_change_name_enter)
         
         # state /all/change_name/waiting
-        self.states["/all/change_name/waiting"] = State(29, "/all/change_name/waiting", self)
+        self.states["/all/change_name/waiting"] = State(30, "/all/change_name/waiting", self)
         self.states["/all/change_name/waiting"].setEnter(self._all_change_name_waiting_enter)
         self.states["/all/change_name/waiting"].setExit(self._all_change_name_waiting_exit)
         
         # state /all/change_name/commit
-        self.states["/all/change_name/commit"] = State(30, "/all/change_name/commit", self)
+        self.states["/all/change_name/commit"] = State(31, "/all/change_name/commit", self)
         self.states["/all/change_name/commit"].setEnter(self._all_change_name_commit_enter)
         
         # state /all/create_new_entry
-        self.states["/all/create_new_entry"] = State(31, "/all/create_new_entry", self)
+        self.states["/all/create_new_entry"] = State(32, "/all/create_new_entry", self)
         self.states["/all/create_new_entry"].setEnter(self._all_create_new_entry_enter)
         
         # state /all/make_optional
-        self.states["/all/make_optional"] = State(32, "/all/make_optional", self)
+        self.states["/all/make_optional"] = State(33, "/all/make_optional", self)
         self.states["/all/make_optional"].setEnter(self._all_make_optional_enter)
         
         # state /all/make_mandatory
-        self.states["/all/make_mandatory"] = State(33, "/all/make_mandatory", self)
+        self.states["/all/make_mandatory"] = State(34, "/all/make_mandatory", self)
         self.states["/all/make_mandatory"].setEnter(self._all_make_mandatory_enter)
         
         # state /all/delete_entry
-        self.states["/all/delete_entry"] = State(34, "/all/delete_entry", self)
+        self.states["/all/delete_entry"] = State(35, "/all/delete_entry", self)
         self.states["/all/delete_entry"].setEnter(self._all_delete_entry_enter)
         
         # state /all/closing
-        self.states["/all/closing"] = State(35, "/all/closing", self)
+        self.states["/all/closing"] = State(36, "/all/closing", self)
         self.states["/all/closing"].setEnter(self._all_closing_enter)
         
         # state /all/close
-        self.states["/all/close"] = State(36, "/all/close", self)
+        self.states["/all/close"] = State(37, "/all/close", self)
         self.states["/all/close"].setEnter(self._all_close_enter)
         
         # add children
@@ -4633,6 +4638,7 @@ class AttributeEditor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/all/init/resolve_name_of_attr_type"].addChild(self.states["/all/init/resolve_name_of_attr_type/response"])
         self.states["/all/init/create_entries"].addChild(self.states["/all/init/create_entries/check_list"])
         self.states["/all/init/create_entries"].addChild(self.states["/all/init/create_entries/create_entry"])
+        self.states["/all/init/create_entries/create_entry"].addChild(self.states["/all/init/create_entries/create_entry/resolve_entry"])
         self.states["/all/init/create_entries/create_entry"].addChild(self.states["/all/init/create_entries/create_entry/name_entry"])
         self.states["/all/init/create_entries/create_entry"].addChild(self.states["/all/init/create_entries/create_entry/type_dropdown"])
         self.states["/all/init/create_entries/create_entry"].addChild(self.states["/all/init/create_entries/create_entry/optional_button"])
@@ -4655,7 +4661,7 @@ class AttributeEditor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/all/init"].default_state = self.states["/all/init/get_attr_types"]
         self.states["/all/init/resolve_name_of_attr_type"].default_state = self.states["/all/init/resolve_name_of_attr_type/request"]
         self.states["/all/init/create_entries"].default_state = self.states["/all/init/create_entries/check_list"]
-        self.states["/all/init/create_entries/create_entry"].default_state = self.states["/all/init/create_entries/create_entry/name_entry"]
+        self.states["/all/init/create_entries/create_entry"].default_state = self.states["/all/init/create_entries/create_entry/resolve_entry"]
         self.states["/all/init/create_entries/create_entry/name_entry"].default_state = self.states["/all/init/create_entries/create_entry/name_entry/create"]
         self.states["/all/init/create_entries/create_entry/type_dropdown"].default_state = self.states["/all/init/create_entries/create_entry/type_dropdown/create"]
         self.states["/all/init/create_entries/create_entry/optional_button"].default_state = self.states["/all/init/create_entries/create_entry/optional_button/create"]
@@ -4703,6 +4709,12 @@ class AttributeEditor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         _all_init_create_entries_check_list_1.setGuard(self._all_init_create_entries_check_list_1_guard)
         self.states["/all/init/create_entries/check_list"].addTransition(_all_init_create_entries_check_list_1)
         
+        # transition /all/init/create_entries/create_entry/resolve_entry
+        _all_init_create_entries_create_entry_resolve_entry_0 = Transition(self, self.states["/all/init/create_entries/create_entry/resolve_entry"], [self.states["/all/init/create_entries/create_entry/name_entry"]])
+        _all_init_create_entries_create_entry_resolve_entry_0.setAction(self._all_init_create_entries_create_entry_resolve_entry_0_exec)
+        _all_init_create_entries_create_entry_resolve_entry_0.setTrigger(Event("mv_response", None))
+        self.states["/all/init/create_entries/create_entry/resolve_entry"].addTransition(_all_init_create_entries_create_entry_resolve_entry_0)
+        
         # transition /all/init/create_entries/create_entry/name_entry/create
         _all_init_create_entries_create_entry_name_entry_create_0 = Transition(self, self.states["/all/init/create_entries/create_entry/name_entry/create"], [self.states["/all/init/create_entries/create_entry/name_entry/pack"]])
         _all_init_create_entries_create_entry_name_entry_create_0.setAction(self._all_init_create_entries_create_entry_name_entry_create_0_exec)
@@ -4862,7 +4874,6 @@ class AttributeEditor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.current_attr = {'name': current_attr[0], 'type': current_attr[1][0], 'optional': current_attr[1][1]}
     
     def _all_init_create_entries_create_entry_exit(self):
-        print("INC counter")
         self.counter += 1
     
     def _all_change_name_enter(self):
@@ -4874,6 +4885,9 @@ class AttributeEditor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def _all_init_get_defined_attrs_enter(self):
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['read_defined_attrs', [current_model, self.as_element]])]))
     
+    def _all_init_create_entries_create_entry_resolve_entry_enter(self):
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['read_attrs', [current_model, self.current_attr['type']]])]))
+    
     def _all_init_create_entries_create_entry_name_entry_create_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'names', 'Entry', {'parent': self, 'name': self.current_attr['name'], 'value': self.current_attr['name']}]))
     
@@ -4969,6 +4983,12 @@ class AttributeEditor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def _all_init_create_entries_check_list_1_guard(self, parameters):
         return not self.attrs_modify
     
+    def _all_init_create_entries_create_entry_resolve_entry_0_exec(self, parameters):
+        response = parameters[0]
+        self.name_to_id[response['name']] = self.current_attr['type']
+        print("NAME TO ID: " + str(self.name_to_id))
+        self.current_attr['type'] = response['name']
+    
     def _all_init_create_entries_create_entry_name_entry_create_0_exec(self, parameters):
         assoc_name = parameters[0]
         self.big_step.outputEventOM(Event("start_instance", None, [self, assoc_name]))
@@ -5049,7 +5069,7 @@ class AttributeEditor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def _all_running_4_exec(self, parameters):
         event_name = parameters[0]
         new_name = parameters[1]
-        self.parameter = (event_name, new_name)
+        self.parameter = (event_name, self.name_to_id[new_name])
     
     def _all_running_5_exec(self, parameters):
         original_name = parameters[0]
@@ -6811,6 +6831,18 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         groups = {}
         edges = []
         
+        defined_attributes = {}
+        names = {}
+        if current_metamodel == "formalisms/SimpleClassDiagrams":
+            for elem in result:
+                if elem["__type"] == "AttributeLink":
+                    defined_attributes.setdefault(elem["__source"], []).append((elem["name"], elem["__target"], True if elem["optional"] == True else False))
+                if "name" in elem:
+                    names[elem["__id"]] = elem["name"]
+        
+        print("Got defined attributes: " + str(defined_attributes))
+        print("Got names: " + str(names))
+                    
         for elem in list(result):
             is_edge = False
             attrs = {}
@@ -6835,9 +6867,10 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
                 edge_edge = False
         
             if is_edge:
-                cs_elem_id = str(uuid.uuid4())
-                edges.append({"id": cs_elem_id, "type": "ConnectingLine", "offsetSourceX": 0 if edge_edge else 100, "offsetSourceY": 0 if edge_edge else 30, "offsetTargetX": 100, "offsetTargetY": 30, "lineWidth": 3, "lineColour": "black", "arrow": True, "__asid": element_id, "layer": 0, "__source": element_source, "__target": element_target})
-                groups[element_id] = cs_elem_id
+                if not (elem["__type"] == "AttributeLink" and current_metamodel == "formalisms/SimpleClassDiagrams"):
+                    cs_elem_id = str(uuid.uuid4())
+                    edges.append({"id": cs_elem_id, "type": "ConnectingLine", "offsetSourceX": 0 if edge_edge else 100, "offsetSourceY": 0 if edge_edge else 30, "offsetTargetX": 100, "offsetTargetY": 30, "lineWidth": 3, "lineColour": "black", "arrow": True, "__asid": element_id, "layer": 0, "__source": element_source, "__target": element_target})
+                    groups[element_id] = cs_elem_id
             else:
                 # Add the group
                 x, y = self.locations.get(element_id, (30 + (group_counter * 250) % 1000, 30 + ((group_counter / 4) * 250)))
@@ -6854,7 +6887,21 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
                 self.rendered.append({"id": str(uuid.uuid4()), "type": "contains", "__source": group_id, "__target": cs_elem_id})
                 max_text = max(len("%s : %s" % (element_id, element_type)), max_text)
                 # Then the attributes
-                text_counter = 0
+                text_counter = 1
+        
+                for name, attr_type, optional in defined_attributes.get(elem["__id"], []):
+                    cs_elem_id = str(uuid.uuid4())
+                    text = "%s : %s" % (name, names.get(attr_type, "(%s)" % attr_type))
+                    if optional:
+                        text = text.replace(" : ", " ?: ")
+                    self.rendered.append({"id": cs_elem_id, "type": "Text", "x": 10, "y": 25 + text_counter * 11, "text": text, "lineWidth": 3, "lineColour": "black", "layer": 2})
+                    max_text = max(len(text), max_text)
+                    self.rendered.append({"id": str(uuid.uuid4()), "type": "contains", "__source": group_id, "__target": cs_elem_id})
+                    text_counter += 1
+        
+                if text_counter > 1:
+                    text_counter += 1
+        
                 for key, value in attrs.items():
                     cs_elem_id = str(uuid.uuid4())
                     if isinstance(value, dict):