Browse Source

Allow cascading delete of links on removal of element

Yentl Van Tendeloo 8 years ago
parent
commit
5987d01632

+ 11 - 5
classes/canvas/canvas.xml

@@ -141,6 +141,17 @@
                             <parameter expr="new_location"/>
                         </raise>
                     </transition>
+
+                    <transition event="deleted_group" target=".">
+                        <parameter name="group_element"/>
+                        <script>
+                            del self.group_location[group_element]
+                        </script>
+                        <raise event="deleted_element" scope="narrow" target="'connecting_lines'">
+                            <parameter expr="group_element"/>
+                        </raise>
+                    </transition>
+
                 </state>
 
                 <state id="creating_line" initial="drawing">
@@ -206,11 +217,6 @@
                         </state>
 
                         <state id="check_types">
-                            <onentry>
-                                <script>
-                                    print("Got allowed types: " + str(self.allowed_types))
-                                </script>
-                            </onentry>
                             <transition cond="len(self.allowed_types) == 0" target="../../../ready"/>
                             <transition cond="len(self.allowed_types) == 1" target="../create">
                                 <script>

+ 12 - 4
classes/canvas/canvas_element.xml

@@ -142,11 +142,15 @@
                 <parameter name="ID"/>
             </transition>
 
+            <transition event="middle-click" cond="id(self) == ID and control_pressed" target=".">
+                <parameter name="ID"/>
+                <raise event="modify_defined_attrs" scope="narrow" target="'parent/parent'">
+                    <parameter expr="self.as_element"/>
+                </raise>
+            </transition>
+
             <transition event="right-click" cond="id(self) == ID and not control_pressed" target=".">
                 <parameter name="ID"/>
-                <script>
-                    print("Right click in element " + str(self.cs_element))
-                </script>
                 <raise event="create_line" scope="narrow" target="'parent'">
                     <parameter expr="self.cs_element"/>
                     <parameter expr="self.as_element"/>
@@ -165,6 +169,9 @@
                     <parameter expr="'delete_element'"/>
                     <parameter expr="[current_model, self.as_element]"/>
                 </raise>
+                <raise event="deleted_group" scope="narrow" target="'parent'">
+                    <parameter expr="self.cs_element"/>
+                </raise>
                 <script>
                     for f in self.elements:
                         self.containing_canvas.delete(f)
@@ -172,7 +179,8 @@
                 </script>
             </onentry>
 
-            <transition event="mv_response" target="../main"/>
+            <transition event="mv_response" target="../main">
+            </transition>
         </state>
 
         <state id="dragging">

+ 19 - 3
classes/canvas/connecting_line.xml

@@ -79,9 +79,6 @@
 
             <transition event="right-click" cond="id(self) == ID and not control_pressed" target=".">
                 <parameter name="ID"/>
-                <script>
-                    print("Right click in element " + str(self.cs_element))
-                </script>
                 <raise event="create_line" scope="narrow" target="'parent'">
                     <parameter expr="self.cs_element['id']"/>
                     <parameter expr="self.as_element"/>
@@ -89,6 +86,13 @@
                 </raise>
             </transition>
 
+            <transition event="middle-click" cond="id(self) == ID and control_pressed" target=".">
+                <parameter name="ID"/>
+                <raise event="modify_defined_attrs" scope="narrow" target="'parent/parent'">
+                    <parameter expr="self.as_element"/>
+                </raise>
+            </transition>
+
             <transition event="moved_element" cond="element == self.cs_element['__source'] or element == self.cs_element['__target']" target=".">
                 <parameter name="element"/>
                 <parameter name="new_location"/>
@@ -117,6 +121,18 @@
                     <parameter expr="(self.middle_x, self.middle_y)"/>
                 </raise>
             </transition>
+
+            <transition event="deleted_element" cond="element == self.cs_element['__source'] or element == self.cs_element['__target']" target=".">
+                <parameter name="element"/>
+                <script>
+                    for f in self.elements:
+                        self.containing_canvas.delete(f)
+                    self.elements = {}
+                </script>
+                <raise event="deleted_group" scope="narrow" target="'parent'">
+                    <parameter expr="self.cs_element['id']"/>
+                </raise>
+            </transition>
         </state>
 
         <state id="update_attrs" initial="query">

+ 28 - 1
classes/modelverse/modelverse.xml

@@ -1161,6 +1161,27 @@
                         </transition>
                     </state>
 
+                    <state id="read_defined_attrs">
+                        <onentry>
+                            <raise event="request">
+                                <parameter expr="['read_defined_attrs', self.parameters[1]]"/>
+                            </raise>
+                        </onentry>
+
+                        <transition cond="self.expect_response_partial('Success: ', pop=False)" target="../../wait_for_action/history">
+                            <script>
+                                response = self.responses.pop(0).strip()
+                                _, response = response.split(": ", 1)
+                                value_mandatory = {line.split(" : ", 1)[0]: line.split(" : ", 1)[1] for line in response.split("\n") if " ?: " not in line}
+                                value_optional = {line.split(" ?: ", 1)[0]: line.split(" ?: ", 1)[1] for line in response.split("\n") if " ?: " in line}
+                            </script>
+                            <raise event="result">
+                                <parameter expr="value_mandatory"/>
+                                <parameter expr="value_optional"/>
+                            </raise>
+                        </transition>
+                    </state>
+
                     <state id="instantiate" initial="decide_node_or_edge">
                         <state id="decide_node_or_edge">
                             <transition cond="self.parameters[2] is None" target="../created">
@@ -1614,7 +1635,7 @@
                             </script>
                         </transition>
 
-                        <transition cond="self.expect_action(None, ['element_list', 'element_list_nice', 'types', 'types_full', 'read_info', 'read_attrs', 'instantiate', 'delete_element', 'attr_assign', 'attr_assign_code', 'attr_delete', 'read_outgoing', 'read_incoming', 'read_association_source', 'read_association_destination', 'connections_between', 'define_attribute', 'all_instances'])" target="../../going_manual">
+                        <transition cond="self.expect_action(None, ['element_list', 'element_list_nice', 'types', 'types_full', 'read_info', 'read_attrs', 'read_defined_attrs', 'instantiate', 'delete_element', 'attr_assign', 'attr_assign_code', 'attr_delete', 'read_outgoing', 'read_incoming', 'read_association_source', 'read_association_destination', 'connections_between', 'define_attribute', 'all_instances'])" target="../../going_manual">
                         </transition>
                     </state>
 
@@ -1670,6 +1691,12 @@
                                 </script>
                             </transition>
 
+                            <transition cond="self.expect_action(self.context, 'read_defined_attrs')" target="../../../operations/read_defined_attrs">
+                                <script>
+                                    self.load_action(self.context)
+                                </script>
+                            </transition>
+
                             <transition cond="self.expect_action(self.context, 'instantiate')" target="../../../operations/instantiate">
                                 <script>
                                     self.load_action(self.context)

+ 109 - 0
classes/window/attribute_editor.xml

@@ -0,0 +1,109 @@
+<class name="AttributeEditor">
+    <relationships>
+        <inheritance class="tk.Toplevel" priority="1"/>
+        <inheritance class="SCCDWidget" priority="0"/>
+        <association name="buttons" class="Button"/>
+        <association name="parent" class="A"/>
+    </relationships>
+
+    <constructor>
+        <parameter name="entries"/>
+        <parameter name="options"/>
+        <super class="tk.TopLevel"/>
+        <super class="SCCDWidget"/>
+        <body>
+            self.entries = {}
+
+            self.frame = tk.Frame(self)
+            counter = 0
+            for k, v in entries.items():
+                label = tk.Label(self.frame, text=k)
+                entry = tk.Entry(self.frame, **options.get(k, {}))
+                entry.insert(0, v)
+
+                label.grid(row=counter, column=0)
+                entry.grid(row=counter, column=1)
+                counter += 1
+
+                self.entries[k] = entry
+
+            self.frame.pack()
+        </body>
+    </constructor>
+    <destructor>
+        <body>
+            self.destroy()
+        </body>
+    </destructor>
+
+    <scxml initial="init">
+        <state id="init" initial="init_button_OK">
+            <state id="init_button_OK">
+                <onentry>
+                    <raise event="create_instance" scope="cd">
+                        <parameter expr="'buttons'"/>
+                        <parameter expr="'Button'"/>
+                        <parameter expr="{'parent': self, 'visual': TextVisual('OK'), 'tooltip_text': 'Accept values', 'event_parameters': 'OK'}"/>
+                    </raise>
+                </onentry>
+
+                <transition event="instance_created" target="../wait_for_packing">
+                    <parameter name="association_name"/>
+                    <raise event="start_instance" scope="cd">
+                        <parameter expr="association_name"/>
+                    </raise>
+
+                    <script>
+                        self.button = association_name
+                    </script>
+                </transition>
+            </state>
+
+            <state id="wait_for_packing">
+                <transition event="tk_widget" target="../../root">
+                    <parameter name="tk_elem"/>
+                    <script>
+                        tk_elem.pack(fill=tk.X)
+                    </script>
+                </transition>
+            </state>
+        </state>
+
+        <state id="root">
+            <transition event="button_pressed" cond="event_name == 'OK'" target="../closing">
+                <parameter name="event_name"/>
+
+                <script>
+                    results = {}
+                    for k, v in self.entries.items():
+                        results[k] = v.get()
+                    print("SENDING DATA")
+                </script>
+
+                <raise event="prompt_results" scope="narrow" target="'parent'">
+                    <parameter expr="results"/>
+                </raise>
+            </transition>
+
+            <transition event="window-close" cond="ID == id(self)" target="../closing">
+                <parameter name="ID"/>
+            </transition>
+        </state>
+
+        <state id="closing">
+            <onentry>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="self.button"/>
+                </raise>
+            </onentry>
+
+            <transition event="instance_deleted" target="../close"/>
+        </state>
+            
+        <state id="close">
+            <onentry>
+                <raise event="close_window" scope="narrow" target="'parent'"/>
+            </onentry>
+        </state>
+    </scxml>
+</class>

+ 37 - 0
classes/window/main_window.xml

@@ -113,6 +113,12 @@
                         <transition event="custom_MM" target="../custom_MM"/>
                         <transition event="upload_MVC" target="../upload_MVC"/>
                         <transition event="add_object_diagrams" target="../add_object_diagrams"/>
+                        <transition event="modify_defined_attrs" target="../modify_defined_attrs">
+                            <parameter name="as_element"/>
+                            <script>
+                                self.as_element = as_element
+                            </script>
+                        </transition>
 
                         <transition event="change_metamodel" target="../change_metamodel">
                             <parameter name="new_metamodel"/>
@@ -144,6 +150,37 @@
                         </transition>
                     </state>
 
+                    <state id="modify_defined_attrs" initial="create_window">
+                        <state id="create_window">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'subwindow'"/>
+                                    <parameter expr="'AttributeEditor'"/>
+                                    <parameter expr="current_model"/>
+                                    <parameter expr="self.as_element"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="instance_created" target="../wait_for_finished">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                                <script>
+                                    self.current_window = assoc_name
+                                </script>
+                            </transition>
+                        </state>
+
+                        <state id="wait_for_finished">
+                            <transition event="close_window" target="../../rerender_model">
+                                <raise event="delete_instance" scope="cd">
+                                    <parameter expr="self.current_window"/>
+                                </raise>
+                            </transition>
+                        </state>
+                    </state>
+
                     <state id="add_object_diagrams" initial="init">
                         <state id="init">
                             <onentry>

+ 273 - 146
frontend.py

@@ -1,7 +1,7 @@
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
-Date:   Tue Oct 10 14:48:35 2017
+Date:   Wed Oct 11 17:48:31 2017
 
 Model author: Yentl Van Tendeloo
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -894,110 +894,114 @@ class Modelverse(RuntimeClassBase):
         self.states["/initialized/behaviour/operations/read_attrs"] = State(91, "/initialized/behaviour/operations/read_attrs", self)
         self.states["/initialized/behaviour/operations/read_attrs"].setEnter(self._initialized_behaviour_operations_read_attrs_enter)
         
+        # state /initialized/behaviour/operations/read_defined_attrs
+        self.states["/initialized/behaviour/operations/read_defined_attrs"] = State(92, "/initialized/behaviour/operations/read_defined_attrs", self)
+        self.states["/initialized/behaviour/operations/read_defined_attrs"].setEnter(self._initialized_behaviour_operations_read_defined_attrs_enter)
+        
         # state /initialized/behaviour/operations/instantiate
-        self.states["/initialized/behaviour/operations/instantiate"] = State(92, "/initialized/behaviour/operations/instantiate", self)
+        self.states["/initialized/behaviour/operations/instantiate"] = State(93, "/initialized/behaviour/operations/instantiate", self)
         
         # state /initialized/behaviour/operations/instantiate/decide_node_or_edge
-        self.states["/initialized/behaviour/operations/instantiate/decide_node_or_edge"] = State(93, "/initialized/behaviour/operations/instantiate/decide_node_or_edge", self)
+        self.states["/initialized/behaviour/operations/instantiate/decide_node_or_edge"] = State(94, "/initialized/behaviour/operations/instantiate/decide_node_or_edge", self)
         
         # state /initialized/behaviour/operations/instantiate/created
-        self.states["/initialized/behaviour/operations/instantiate/created"] = State(94, "/initialized/behaviour/operations/instantiate/created", self)
+        self.states["/initialized/behaviour/operations/instantiate/created"] = State(95, "/initialized/behaviour/operations/instantiate/created", self)
         
         # state /initialized/behaviour/operations/delete_element
-        self.states["/initialized/behaviour/operations/delete_element"] = State(95, "/initialized/behaviour/operations/delete_element", self)
+        self.states["/initialized/behaviour/operations/delete_element"] = State(96, "/initialized/behaviour/operations/delete_element", self)
         self.states["/initialized/behaviour/operations/delete_element"].setEnter(self._initialized_behaviour_operations_delete_element_enter)
         
         # state /initialized/behaviour/operations/attr_assign
-        self.states["/initialized/behaviour/operations/attr_assign"] = State(96, "/initialized/behaviour/operations/attr_assign", self)
+        self.states["/initialized/behaviour/operations/attr_assign"] = State(97, "/initialized/behaviour/operations/attr_assign", self)
         self.states["/initialized/behaviour/operations/attr_assign"].setEnter(self._initialized_behaviour_operations_attr_assign_enter)
         
         # state /initialized/behaviour/operations/attr_assign_code
-        self.states["/initialized/behaviour/operations/attr_assign_code"] = State(97, "/initialized/behaviour/operations/attr_assign_code", self)
+        self.states["/initialized/behaviour/operations/attr_assign_code"] = State(98, "/initialized/behaviour/operations/attr_assign_code", self)
         self.states["/initialized/behaviour/operations/attr_assign_code"].setEnter(self._initialized_behaviour_operations_attr_assign_code_enter)
         
         # state /initialized/behaviour/operations/attr_delete
-        self.states["/initialized/behaviour/operations/attr_delete"] = State(98, "/initialized/behaviour/operations/attr_delete", self)
+        self.states["/initialized/behaviour/operations/attr_delete"] = State(99, "/initialized/behaviour/operations/attr_delete", self)
         self.states["/initialized/behaviour/operations/attr_delete"].setEnter(self._initialized_behaviour_operations_attr_delete_enter)
         
         # state /initialized/behaviour/operations/read_outgoing
-        self.states["/initialized/behaviour/operations/read_outgoing"] = State(99, "/initialized/behaviour/operations/read_outgoing", self)
+        self.states["/initialized/behaviour/operations/read_outgoing"] = State(100, "/initialized/behaviour/operations/read_outgoing", self)
         self.states["/initialized/behaviour/operations/read_outgoing"].setEnter(self._initialized_behaviour_operations_read_outgoing_enter)
         
         # state /initialized/behaviour/operations/read_incoming
-        self.states["/initialized/behaviour/operations/read_incoming"] = State(100, "/initialized/behaviour/operations/read_incoming", self)
+        self.states["/initialized/behaviour/operations/read_incoming"] = State(101, "/initialized/behaviour/operations/read_incoming", self)
         self.states["/initialized/behaviour/operations/read_incoming"].setEnter(self._initialized_behaviour_operations_read_incoming_enter)
         
         # state /initialized/behaviour/operations/read_association_source
-        self.states["/initialized/behaviour/operations/read_association_source"] = State(101, "/initialized/behaviour/operations/read_association_source", self)
+        self.states["/initialized/behaviour/operations/read_association_source"] = State(102, "/initialized/behaviour/operations/read_association_source", self)
         self.states["/initialized/behaviour/operations/read_association_source"].setEnter(self._initialized_behaviour_operations_read_association_source_enter)
         
         # state /initialized/behaviour/operations/read_association_destination
-        self.states["/initialized/behaviour/operations/read_association_destination"] = State(102, "/initialized/behaviour/operations/read_association_destination", self)
+        self.states["/initialized/behaviour/operations/read_association_destination"] = State(103, "/initialized/behaviour/operations/read_association_destination", self)
         self.states["/initialized/behaviour/operations/read_association_destination"].setEnter(self._initialized_behaviour_operations_read_association_destination_enter)
         
         # state /initialized/behaviour/operations/connections_between
-        self.states["/initialized/behaviour/operations/connections_between"] = State(103, "/initialized/behaviour/operations/connections_between", self)
+        self.states["/initialized/behaviour/operations/connections_between"] = State(104, "/initialized/behaviour/operations/connections_between", self)
         self.states["/initialized/behaviour/operations/connections_between"].setEnter(self._initialized_behaviour_operations_connections_between_enter)
         
         # state /initialized/behaviour/operations/define_attribute
-        self.states["/initialized/behaviour/operations/define_attribute"] = State(104, "/initialized/behaviour/operations/define_attribute", self)
+        self.states["/initialized/behaviour/operations/define_attribute"] = State(105, "/initialized/behaviour/operations/define_attribute", self)
         self.states["/initialized/behaviour/operations/define_attribute"].setEnter(self._initialized_behaviour_operations_define_attribute_enter)
         
         # state /initialized/behaviour/operations/all_instances
-        self.states["/initialized/behaviour/operations/all_instances"] = State(105, "/initialized/behaviour/operations/all_instances", self)
+        self.states["/initialized/behaviour/operations/all_instances"] = State(106, "/initialized/behaviour/operations/all_instances", self)
         self.states["/initialized/behaviour/operations/all_instances"].setEnter(self._initialized_behaviour_operations_all_instances_enter)
         
         # state /initialized/behaviour/operations/save
-        self.states["/initialized/behaviour/operations/save"] = State(106, "/initialized/behaviour/operations/save", self)
+        self.states["/initialized/behaviour/operations/save"] = State(107, "/initialized/behaviour/operations/save", self)
         self.states["/initialized/behaviour/operations/save"].setEnter(self._initialized_behaviour_operations_save_enter)
         
         # state /initialized/behaviour/wait_for_action
-        self.states["/initialized/behaviour/wait_for_action"] = State(107, "/initialized/behaviour/wait_for_action", self)
+        self.states["/initialized/behaviour/wait_for_action"] = State(108, "/initialized/behaviour/wait_for_action", self)
         
         # state /initialized/behaviour/wait_for_action/disconnected
-        self.states["/initialized/behaviour/wait_for_action/disconnected"] = State(108, "/initialized/behaviour/wait_for_action/disconnected", self)
+        self.states["/initialized/behaviour/wait_for_action/disconnected"] = State(109, "/initialized/behaviour/wait_for_action/disconnected", self)
         
         # state /initialized/behaviour/wait_for_action/connected
-        self.states["/initialized/behaviour/wait_for_action/connected"] = State(109, "/initialized/behaviour/wait_for_action/connected", self)
+        self.states["/initialized/behaviour/wait_for_action/connected"] = State(110, "/initialized/behaviour/wait_for_action/connected", self)
         
         # state /initialized/behaviour/wait_for_action/megamodelling
-        self.states["/initialized/behaviour/wait_for_action/megamodelling"] = State(110, "/initialized/behaviour/wait_for_action/megamodelling", self)
+        self.states["/initialized/behaviour/wait_for_action/megamodelling"] = State(111, "/initialized/behaviour/wait_for_action/megamodelling", self)
         
         # state /initialized/behaviour/wait_for_action/modelling
-        self.states["/initialized/behaviour/wait_for_action/modelling"] = State(111, "/initialized/behaviour/wait_for_action/modelling", self)
+        self.states["/initialized/behaviour/wait_for_action/modelling"] = State(112, "/initialized/behaviour/wait_for_action/modelling", self)
         
         # state /initialized/behaviour/wait_for_action/modelling/recognized
-        self.states["/initialized/behaviour/wait_for_action/modelling/recognized"] = State(112, "/initialized/behaviour/wait_for_action/modelling/recognized", self)
+        self.states["/initialized/behaviour/wait_for_action/modelling/recognized"] = State(113, "/initialized/behaviour/wait_for_action/modelling/recognized", self)
         
         # state /initialized/behaviour/wait_for_action/modelling/recognized/manual
-        self.states["/initialized/behaviour/wait_for_action/modelling/recognized/manual"] = State(113, "/initialized/behaviour/wait_for_action/modelling/recognized/manual", self)
+        self.states["/initialized/behaviour/wait_for_action/modelling/recognized/manual"] = State(114, "/initialized/behaviour/wait_for_action/modelling/recognized/manual", self)
         
         # state /initialized/behaviour/wait_for_action/modelling/recognized/scripted
-        self.states["/initialized/behaviour/wait_for_action/modelling/recognized/scripted"] = State(114, "/initialized/behaviour/wait_for_action/modelling/recognized/scripted", self)
+        self.states["/initialized/behaviour/wait_for_action/modelling/recognized/scripted"] = State(115, "/initialized/behaviour/wait_for_action/modelling/recognized/scripted", self)
         
         # state /initialized/behaviour/wait_for_action/finished
-        self.states["/initialized/behaviour/wait_for_action/finished"] = State(115, "/initialized/behaviour/wait_for_action/finished", self)
+        self.states["/initialized/behaviour/wait_for_action/finished"] = State(116, "/initialized/behaviour/wait_for_action/finished", self)
         
         # state /initialized/behaviour/wait_for_action/history
-        self.states["/initialized/behaviour/wait_for_action/history"] = DeepHistoryState(116, "/initialized/behaviour/wait_for_action/history", self)
+        self.states["/initialized/behaviour/wait_for_action/history"] = DeepHistoryState(117, "/initialized/behaviour/wait_for_action/history", self)
         
         # state /initialized/behaviour/going_manual
-        self.states["/initialized/behaviour/going_manual"] = State(117, "/initialized/behaviour/going_manual", self)
+        self.states["/initialized/behaviour/going_manual"] = State(118, "/initialized/behaviour/going_manual", self)
         self.states["/initialized/behaviour/going_manual"].setEnter(self._initialized_behaviour_going_manual_enter)
         
         # state /initialized/behaviour/going_scripted
-        self.states["/initialized/behaviour/going_scripted"] = State(118, "/initialized/behaviour/going_scripted", self)
+        self.states["/initialized/behaviour/going_scripted"] = State(119, "/initialized/behaviour/going_scripted", self)
         self.states["/initialized/behaviour/going_scripted"].setEnter(self._initialized_behaviour_going_scripted_enter)
         
         # state /initialized/behaviour/leaving_manual
-        self.states["/initialized/behaviour/leaving_manual"] = State(119, "/initialized/behaviour/leaving_manual", self)
+        self.states["/initialized/behaviour/leaving_manual"] = State(120, "/initialized/behaviour/leaving_manual", self)
         self.states["/initialized/behaviour/leaving_manual"].setEnter(self._initialized_behaviour_leaving_manual_enter)
         
         # state /initialized/queue
-        self.states["/initialized/queue"] = State(120, "/initialized/queue", self)
+        self.states["/initialized/queue"] = State(121, "/initialized/queue", self)
         
         # state /initialized/queue/queue
-        self.states["/initialized/queue/queue"] = State(121, "/initialized/queue/queue", self)
+        self.states["/initialized/queue/queue"] = State(122, "/initialized/queue/queue", self)
         
         # add children
         self.states[""].addChild(self.states["/init"])
@@ -1055,6 +1059,7 @@ class Modelverse(RuntimeClassBase):
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/types_full"])
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/read_info"])
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/read_attrs"])
+        self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/read_defined_attrs"])
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/instantiate"])
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/delete_element"])
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/attr_assign"])
@@ -1700,6 +1705,13 @@ class Modelverse(RuntimeClassBase):
         _initialized_behaviour_operations_read_attrs_0.setGuard(self._initialized_behaviour_operations_read_attrs_0_guard)
         self.states["/initialized/behaviour/operations/read_attrs"].addTransition(_initialized_behaviour_operations_read_attrs_0)
         
+        # transition /initialized/behaviour/operations/read_defined_attrs
+        _initialized_behaviour_operations_read_defined_attrs_0 = Transition(self, self.states["/initialized/behaviour/operations/read_defined_attrs"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_read_defined_attrs_0.setAction(self._initialized_behaviour_operations_read_defined_attrs_0_exec)
+        _initialized_behaviour_operations_read_defined_attrs_0.setTrigger(None)
+        _initialized_behaviour_operations_read_defined_attrs_0.setGuard(self._initialized_behaviour_operations_read_defined_attrs_0_guard)
+        self.states["/initialized/behaviour/operations/read_defined_attrs"].addTransition(_initialized_behaviour_operations_read_defined_attrs_0)
+        
         # transition /initialized/behaviour/operations/instantiate/decide_node_or_edge
         _initialized_behaviour_operations_instantiate_decide_node_or_edge_0 = Transition(self, self.states["/initialized/behaviour/operations/instantiate/decide_node_or_edge"], [self.states["/initialized/behaviour/operations/instantiate/created"]])
         _initialized_behaviour_operations_instantiate_decide_node_or_edge_0.setAction(self._initialized_behaviour_operations_instantiate_decide_node_or_edge_0_exec)
@@ -2154,76 +2166,81 @@ class Modelverse(RuntimeClassBase):
         _initialized_behaviour_wait_for_action_modelling_recognized_5.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_5.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_5_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_5)
-        _initialized_behaviour_wait_for_action_modelling_recognized_6 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/instantiate"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_6 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/read_defined_attrs"]])
         _initialized_behaviour_wait_for_action_modelling_recognized_6.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_6_exec)
         _initialized_behaviour_wait_for_action_modelling_recognized_6.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_6.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_6_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_6)
-        _initialized_behaviour_wait_for_action_modelling_recognized_7 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/delete_element"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_7 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/instantiate"]])
         _initialized_behaviour_wait_for_action_modelling_recognized_7.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_7_exec)
         _initialized_behaviour_wait_for_action_modelling_recognized_7.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_7.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_7_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_7)
-        _initialized_behaviour_wait_for_action_modelling_recognized_8 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/attr_assign"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_8 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/delete_element"]])
         _initialized_behaviour_wait_for_action_modelling_recognized_8.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_8_exec)
         _initialized_behaviour_wait_for_action_modelling_recognized_8.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_8.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_8_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_8)
-        _initialized_behaviour_wait_for_action_modelling_recognized_9 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/model_upload"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_9 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/attr_assign"]])
         _initialized_behaviour_wait_for_action_modelling_recognized_9.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_9_exec)
         _initialized_behaviour_wait_for_action_modelling_recognized_9.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_9.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_9_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_9)
-        _initialized_behaviour_wait_for_action_modelling_recognized_10 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/attr_assign_code"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_10 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/model_upload"]])
         _initialized_behaviour_wait_for_action_modelling_recognized_10.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_10_exec)
         _initialized_behaviour_wait_for_action_modelling_recognized_10.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_10.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_10_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_10)
-        _initialized_behaviour_wait_for_action_modelling_recognized_11 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/attr_delete"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_11 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/attr_assign_code"]])
         _initialized_behaviour_wait_for_action_modelling_recognized_11.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_11_exec)
         _initialized_behaviour_wait_for_action_modelling_recognized_11.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_11.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_11_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_11)
-        _initialized_behaviour_wait_for_action_modelling_recognized_12 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/read_outgoing"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_12 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/attr_delete"]])
         _initialized_behaviour_wait_for_action_modelling_recognized_12.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_12_exec)
         _initialized_behaviour_wait_for_action_modelling_recognized_12.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_12.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_12_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_12)
-        _initialized_behaviour_wait_for_action_modelling_recognized_13 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/read_incoming"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_13 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/read_outgoing"]])
         _initialized_behaviour_wait_for_action_modelling_recognized_13.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_13_exec)
         _initialized_behaviour_wait_for_action_modelling_recognized_13.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_13.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_13_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_13)
-        _initialized_behaviour_wait_for_action_modelling_recognized_14 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/read_association_source"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_14 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/read_incoming"]])
         _initialized_behaviour_wait_for_action_modelling_recognized_14.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_14_exec)
         _initialized_behaviour_wait_for_action_modelling_recognized_14.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_14.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_14_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_14)
-        _initialized_behaviour_wait_for_action_modelling_recognized_15 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/read_association_destination"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_15 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/read_association_source"]])
         _initialized_behaviour_wait_for_action_modelling_recognized_15.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_15_exec)
         _initialized_behaviour_wait_for_action_modelling_recognized_15.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_15.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_15_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_15)
-        _initialized_behaviour_wait_for_action_modelling_recognized_16 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/connections_between"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_16 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/read_association_destination"]])
         _initialized_behaviour_wait_for_action_modelling_recognized_16.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_16_exec)
         _initialized_behaviour_wait_for_action_modelling_recognized_16.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_16.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_16_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_16)
-        _initialized_behaviour_wait_for_action_modelling_recognized_17 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/define_attribute"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_17 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/connections_between"]])
         _initialized_behaviour_wait_for_action_modelling_recognized_17.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_17_exec)
         _initialized_behaviour_wait_for_action_modelling_recognized_17.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_17.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_17_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_17)
-        _initialized_behaviour_wait_for_action_modelling_recognized_18 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/all_instances"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_18 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/define_attribute"]])
         _initialized_behaviour_wait_for_action_modelling_recognized_18.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_18_exec)
         _initialized_behaviour_wait_for_action_modelling_recognized_18.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_18.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_18_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_18)
-        _initialized_behaviour_wait_for_action_modelling_recognized_19 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/save"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_19 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/all_instances"]])
         _initialized_behaviour_wait_for_action_modelling_recognized_19.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_19_exec)
         _initialized_behaviour_wait_for_action_modelling_recognized_19.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_19.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_19_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_19)
+        _initialized_behaviour_wait_for_action_modelling_recognized_20 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/save"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_20.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_20_exec)
+        _initialized_behaviour_wait_for_action_modelling_recognized_20.setTrigger(None)
+        _initialized_behaviour_wait_for_action_modelling_recognized_20.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_20_guard)
+        self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_20)
     
     def _initialized_enter(self):
         self.raiseInternalEvent(Event("ready", None, []))
@@ -2393,6 +2410,9 @@ class Modelverse(RuntimeClassBase):
     def _initialized_behaviour_operations_read_attrs_enter(self):
         self.raiseInternalEvent(Event("request", None, [['read_attrs', self.parameters[1]]]))
     
+    def _initialized_behaviour_operations_read_defined_attrs_enter(self):
+        self.raiseInternalEvent(Event("request", None, [['read_defined_attrs', self.parameters[1]]]))
+    
     def _initialized_behaviour_operations_delete_element_enter(self):
         self.raiseInternalEvent(Event("request", None, [['delete', self.parameters[1]]]))
     
@@ -2529,84 +2549,90 @@ class Modelverse(RuntimeClassBase):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_6_guard(self, parameters):
-        return self.expect_action(self.context, 'instantiate')
+        return self.expect_action(self.context, 'read_defined_attrs')
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_7_exec(self, parameters):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_7_guard(self, parameters):
-        return self.expect_action(self.context, 'delete_element')
+        return self.expect_action(self.context, 'instantiate')
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_8_exec(self, parameters):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_8_guard(self, parameters):
-        return self.expect_action(self.context, 'attr_assign')
+        return self.expect_action(self.context, 'delete_element')
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_9_exec(self, parameters):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_9_guard(self, parameters):
-        return self.expect_action(self.context, 'model_overwrite')
+        return self.expect_action(self.context, 'attr_assign')
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_10_exec(self, parameters):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_10_guard(self, parameters):
-        return self.expect_action(self.context, 'attr_assign_code')
+        return self.expect_action(self.context, 'model_overwrite')
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_11_exec(self, parameters):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_11_guard(self, parameters):
-        return self.expect_action(self.context, 'attr_delete')
+        return self.expect_action(self.context, 'attr_assign_code')
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_12_exec(self, parameters):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_12_guard(self, parameters):
-        return self.expect_action(self.context, 'read_outgoing')
+        return self.expect_action(self.context, 'attr_delete')
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_13_exec(self, parameters):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_13_guard(self, parameters):
-        return self.expect_action(self.context, 'read_incoming')
+        return self.expect_action(self.context, 'read_outgoing')
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_14_exec(self, parameters):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_14_guard(self, parameters):
-        return self.expect_action(self.context, 'read_association_source')
+        return self.expect_action(self.context, 'read_incoming')
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_15_exec(self, parameters):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_15_guard(self, parameters):
-        return self.expect_action(self.context, 'read_association_destination')
+        return self.expect_action(self.context, 'read_association_source')
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_16_exec(self, parameters):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_16_guard(self, parameters):
-        return self.expect_action(self.context, 'connections_between')
+        return self.expect_action(self.context, 'read_association_destination')
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_17_exec(self, parameters):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_17_guard(self, parameters):
-        return self.expect_action(self.context, 'define_attribute')
+        return self.expect_action(self.context, 'connections_between')
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_18_exec(self, parameters):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_18_guard(self, parameters):
-        return self.expect_action(self.context, 'all_instances')
+        return self.expect_action(self.context, 'define_attribute')
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_19_exec(self, parameters):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_19_guard(self, parameters):
+        return self.expect_action(self.context, 'all_instances')
+    
+    def _initialized_behaviour_wait_for_action_modelling_recognized_20_exec(self, parameters):
+        self.load_action(self.context)
+    
+    def _initialized_behaviour_wait_for_action_modelling_recognized_20_guard(self, parameters):
         return self.expect_action(self.context, 'save')
     
     def _init_0_exec(self, parameters):
@@ -3087,6 +3113,16 @@ class Modelverse(RuntimeClassBase):
     def _initialized_behaviour_operations_read_attrs_0_guard(self, parameters):
         return self.expect_response_partial('Success: ', pop=False)
     
+    def _initialized_behaviour_operations_read_defined_attrs_0_exec(self, parameters):
+        response = self.responses.pop(0).strip()
+        _, response = response.split(": ", 1)
+        value_mandatory = {line.split(" : ", 1)[0]: line.split(" : ", 1)[1] for line in response.split("\n") if " ?: " not in line}
+        value_optional = {line.split(" ?: ", 1)[0]: line.split(" ?: ", 1)[1] for line in response.split("\n") if " ?: " in line}
+        self.raiseInternalEvent(Event("result", None, [value_mandatory, value_optional]))
+    
+    def _initialized_behaviour_operations_read_defined_attrs_0_guard(self, parameters):
+        return self.expect_response_partial('Success: ', pop=False)
+    
     def _initialized_behaviour_operations_instantiate_decide_node_or_edge_0_exec(self, parameters):
         self.raiseInternalEvent(Event("request", None, [['instantiate_node', self.parameters[1], self.parameters[3]]]))
     
@@ -3406,7 +3442,7 @@ class Modelverse(RuntimeClassBase):
         return self.expect_action(None, 'model_types')
     
     def _initialized_behaviour_wait_for_action_megamodelling_36_guard(self, parameters):
-        return self.expect_action(None, ['element_list', 'element_list_nice', 'types', 'types_full', 'read_info', 'read_attrs', 'instantiate', 'delete_element', 'attr_assign', 'attr_assign_code', 'attr_delete', 'read_outgoing', 'read_incoming', 'read_association_source', 'read_association_destination', 'connections_between', 'define_attribute', 'all_instances'])
+        return self.expect_action(None, ['element_list', 'element_list_nice', 'types', 'types_full', 'read_info', 'read_attrs', 'read_defined_attrs', 'instantiate', 'delete_element', 'attr_assign', 'attr_assign_code', 'attr_delete', 'read_outgoing', 'read_incoming', 'read_association_source', 'read_association_destination', 'connections_between', 'define_attribute', 'all_instances'])
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_manual_0_guard(self, parameters):
         return self.expect_action(self.context, 'exit')
@@ -4036,224 +4072,234 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/init/init/running/idle"] = State(9, "/init/init/running/idle", self)
         self.states["/init/init/running/idle"].setEnter(self._init_init_running_idle_enter)
         
+        # state /init/init/running/modify_defined_attrs
+        self.states["/init/init/running/modify_defined_attrs"] = State(10, "/init/init/running/modify_defined_attrs", self)
+        
+        # state /init/init/running/modify_defined_attrs/create_window
+        self.states["/init/init/running/modify_defined_attrs/create_window"] = State(11, "/init/init/running/modify_defined_attrs/create_window", self)
+        self.states["/init/init/running/modify_defined_attrs/create_window"].setEnter(self._init_init_running_modify_defined_attrs_create_window_enter)
+        
+        # state /init/init/running/modify_defined_attrs/wait_for_finished
+        self.states["/init/init/running/modify_defined_attrs/wait_for_finished"] = State(12, "/init/init/running/modify_defined_attrs/wait_for_finished", self)
+        
         # state /init/init/running/add_object_diagrams
-        self.states["/init/init/running/add_object_diagrams"] = State(10, "/init/init/running/add_object_diagrams", self)
+        self.states["/init/init/running/add_object_diagrams"] = State(13, "/init/init/running/add_object_diagrams", self)
         
         # state /init/init/running/add_object_diagrams/init
-        self.states["/init/init/running/add_object_diagrams/init"] = State(11, "/init/init/running/add_object_diagrams/init", self)
+        self.states["/init/init/running/add_object_diagrams/init"] = State(14, "/init/init/running/add_object_diagrams/init", self)
         self.states["/init/init/running/add_object_diagrams/init"].setEnter(self._init_init_running_add_object_diagrams_init_enter)
         
         # state /init/init/running/add_object_diagrams/modify_render_OD
-        self.states["/init/init/running/add_object_diagrams/modify_render_OD"] = State(12, "/init/init/running/add_object_diagrams/modify_render_OD", self)
+        self.states["/init/init/running/add_object_diagrams/modify_render_OD"] = State(15, "/init/init/running/add_object_diagrams/modify_render_OD", self)
         self.states["/init/init/running/add_object_diagrams/modify_render_OD"].setExit(self._init_init_running_add_object_diagrams_modify_render_OD_exit)
         
         # state /init/init/running/add_object_diagrams/modify_render_OD/exit
-        self.states["/init/init/running/add_object_diagrams/modify_render_OD/exit"] = State(13, "/init/init/running/add_object_diagrams/modify_render_OD/exit", self)
+        self.states["/init/init/running/add_object_diagrams/modify_render_OD/exit"] = State(16, "/init/init/running/add_object_diagrams/modify_render_OD/exit", self)
         self.states["/init/init/running/add_object_diagrams/modify_render_OD/exit"].setEnter(self._init_init_running_add_object_diagrams_modify_render_OD_exit_enter)
         
         # state /init/init/running/upload_MVC
-        self.states["/init/init/running/upload_MVC"] = State(14, "/init/init/running/upload_MVC", self)
+        self.states["/init/init/running/upload_MVC"] = State(17, "/init/init/running/upload_MVC", self)
         
         # state /init/init/running/upload_MVC/load_code
-        self.states["/init/init/running/upload_MVC/load_code"] = State(15, "/init/init/running/upload_MVC/load_code", self)
+        self.states["/init/init/running/upload_MVC/load_code"] = State(18, "/init/init/running/upload_MVC/load_code", self)
         self.states["/init/init/running/upload_MVC/load_code"].setEnter(self._init_init_running_upload_MVC_load_code_enter)
         
         # state /init/init/running/upload_MVC/overwriting_model
-        self.states["/init/init/running/upload_MVC/overwriting_model"] = State(16, "/init/init/running/upload_MVC/overwriting_model", self)
+        self.states["/init/init/running/upload_MVC/overwriting_model"] = State(19, "/init/init/running/upload_MVC/overwriting_model", self)
         
         # state /init/init/running/change_metamodel
-        self.states["/init/init/running/change_metamodel"] = State(17, "/init/init/running/change_metamodel", self)
+        self.states["/init/init/running/change_metamodel"] = State(20, "/init/init/running/change_metamodel", self)
         self.states["/init/init/running/change_metamodel"].setEnter(self._init_init_running_change_metamodel_enter)
         
         # state /init/init/running/conf_bottom
-        self.states["/init/init/running/conf_bottom"] = State(18, "/init/init/running/conf_bottom", self)
+        self.states["/init/init/running/conf_bottom"] = State(21, "/init/init/running/conf_bottom", self)
         
         # state /init/init/running/conf_bottom/check_if_exists
-        self.states["/init/init/running/conf_bottom/check_if_exists"] = State(19, "/init/init/running/conf_bottom/check_if_exists", self)
+        self.states["/init/init/running/conf_bottom/check_if_exists"] = State(22, "/init/init/running/conf_bottom/check_if_exists", self)
         
         # state /init/init/running/conf_bottom/add_bottom
-        self.states["/init/init/running/conf_bottom/add_bottom"] = State(20, "/init/init/running/conf_bottom/add_bottom", self)
+        self.states["/init/init/running/conf_bottom/add_bottom"] = State(23, "/init/init/running/conf_bottom/add_bottom", self)
         self.states["/init/init/running/conf_bottom/add_bottom"].setEnter(self._init_init_running_conf_bottom_add_bottom_enter)
         
         # state /init/init/running/custom_MM
-        self.states["/init/init/running/custom_MM"] = State(21, "/init/init/running/custom_MM", self)
+        self.states["/init/init/running/custom_MM"] = State(24, "/init/init/running/custom_MM", self)
         
         # state /init/init/running/custom_MM/query
-        self.states["/init/init/running/custom_MM/query"] = State(22, "/init/init/running/custom_MM/query", self)
+        self.states["/init/init/running/custom_MM/query"] = State(25, "/init/init/running/custom_MM/query", self)
         self.states["/init/init/running/custom_MM/query"].setEnter(self._init_init_running_custom_MM_query_enter)
         
         # state /init/init/running/custom_MM/wait_for_metamodel
-        self.states["/init/init/running/custom_MM/wait_for_metamodel"] = State(23, "/init/init/running/custom_MM/wait_for_metamodel", self)
+        self.states["/init/init/running/custom_MM/wait_for_metamodel"] = State(26, "/init/init/running/custom_MM/wait_for_metamodel", self)
         self.states["/init/init/running/custom_MM/wait_for_metamodel"].setEnter(self._init_init_running_custom_MM_wait_for_metamodel_enter)
         
         # state /init/init/running/custom_MM/wait_for_metamodel/wait_for_result
-        self.states["/init/init/running/custom_MM/wait_for_metamodel/wait_for_result"] = State(24, "/init/init/running/custom_MM/wait_for_metamodel/wait_for_result", self)
+        self.states["/init/init/running/custom_MM/wait_for_metamodel/wait_for_result"] = State(27, "/init/init/running/custom_MM/wait_for_metamodel/wait_for_result", self)
         
         # state /init/init/running/custom_MM/wait_for_metamodel/got_result
-        self.states["/init/init/running/custom_MM/wait_for_metamodel/got_result"] = State(25, "/init/init/running/custom_MM/wait_for_metamodel/got_result", self)
+        self.states["/init/init/running/custom_MM/wait_for_metamodel/got_result"] = State(28, "/init/init/running/custom_MM/wait_for_metamodel/got_result", self)
         
         # state /init/init/running/custom_MM/wait_for_metamodel/mv_processing
-        self.states["/init/init/running/custom_MM/wait_for_metamodel/mv_processing"] = State(26, "/init/init/running/custom_MM/wait_for_metamodel/mv_processing", self)
+        self.states["/init/init/running/custom_MM/wait_for_metamodel/mv_processing"] = State(29, "/init/init/running/custom_MM/wait_for_metamodel/mv_processing", self)
         
         # state /init/init/running/change_mapper
-        self.states["/init/init/running/change_mapper"] = State(27, "/init/init/running/change_mapper", self)
+        self.states["/init/init/running/change_mapper"] = State(30, "/init/init/running/change_mapper", self)
         
         # state /init/init/running/change_rendered
-        self.states["/init/init/running/change_rendered"] = State(28, "/init/init/running/change_rendered", self)
+        self.states["/init/init/running/change_rendered"] = State(31, "/init/init/running/change_rendered", self)
         
         # state /init/init/running/verify_model
-        self.states["/init/init/running/verify_model"] = State(29, "/init/init/running/verify_model", self)
+        self.states["/init/init/running/verify_model"] = State(32, "/init/init/running/verify_model", self)
         
         # state /init/init/running/verify_model/request
-        self.states["/init/init/running/verify_model/request"] = State(30, "/init/init/running/verify_model/request", self)
+        self.states["/init/init/running/verify_model/request"] = State(33, "/init/init/running/verify_model/request", self)
         self.states["/init/init/running/verify_model/request"].setEnter(self._init_init_running_verify_model_request_enter)
         
         # state /init/init/running/verify_model/show_result
-        self.states["/init/init/running/verify_model/show_result"] = State(31, "/init/init/running/verify_model/show_result", self)
+        self.states["/init/init/running/verify_model/show_result"] = State(34, "/init/init/running/verify_model/show_result", self)
         
         # state /init/init/running/verify_model/wait_for_close
-        self.states["/init/init/running/verify_model/wait_for_close"] = State(32, "/init/init/running/verify_model/wait_for_close", self)
+        self.states["/init/init/running/verify_model/wait_for_close"] = State(35, "/init/init/running/verify_model/wait_for_close", self)
         
         # state /init/init/running/open_model
-        self.states["/init/init/running/open_model"] = State(33, "/init/init/running/open_model", self)
+        self.states["/init/init/running/open_model"] = State(36, "/init/init/running/open_model", self)
         
         # state /init/init/running/open_model/query_model
-        self.states["/init/init/running/open_model/query_model"] = State(34, "/init/init/running/open_model/query_model", self)
+        self.states["/init/init/running/open_model/query_model"] = State(37, "/init/init/running/open_model/query_model", self)
         self.states["/init/init/running/open_model/query_model"].setEnter(self._init_init_running_open_model_query_model_enter)
         
         # state /init/init/running/open_model/wait_for_model
-        self.states["/init/init/running/open_model/wait_for_model"] = State(35, "/init/init/running/open_model/wait_for_model", self)
+        self.states["/init/init/running/open_model/wait_for_model"] = State(38, "/init/init/running/open_model/wait_for_model", self)
         
         # state /init/init/running/open_model/got_model
-        self.states["/init/init/running/open_model/got_model"] = State(36, "/init/init/running/open_model/got_model", self)
+        self.states["/init/init/running/open_model/got_model"] = State(39, "/init/init/running/open_model/got_model", self)
         
         # state /init/init/running/open_model/search_metamodels
-        self.states["/init/init/running/open_model/search_metamodels"] = State(37, "/init/init/running/open_model/search_metamodels", self)
+        self.states["/init/init/running/open_model/search_metamodels"] = State(40, "/init/init/running/open_model/search_metamodels", self)
         self.states["/init/init/running/open_model/search_metamodels"].setEnter(self._init_init_running_open_model_search_metamodels_enter)
         
         # state /init/init/running/open_model/search_CS_mappers
-        self.states["/init/init/running/open_model/search_CS_mappers"] = State(38, "/init/init/running/open_model/search_CS_mappers", self)
+        self.states["/init/init/running/open_model/search_CS_mappers"] = State(41, "/init/init/running/open_model/search_CS_mappers", self)
         self.states["/init/init/running/open_model/search_CS_mappers"].setEnter(self._init_init_running_open_model_search_CS_mappers_enter)
         
         # state /init/init/running/open_model/check_CS_mapper
-        self.states["/init/init/running/open_model/check_CS_mapper"] = State(39, "/init/init/running/open_model/check_CS_mapper", self)
+        self.states["/init/init/running/open_model/check_CS_mapper"] = State(42, "/init/init/running/open_model/check_CS_mapper", self)
         
         # state /init/init/running/open_model/search_CS_rendered
-        self.states["/init/init/running/open_model/search_CS_rendered"] = State(40, "/init/init/running/open_model/search_CS_rendered", self)
+        self.states["/init/init/running/open_model/search_CS_rendered"] = State(43, "/init/init/running/open_model/search_CS_rendered", self)
         self.states["/init/init/running/open_model/search_CS_rendered"].setEnter(self._init_init_running_open_model_search_CS_rendered_enter)
         
         # state /init/init/running/open_model/store_metamodel
-        self.states["/init/init/running/open_model/store_metamodel"] = State(41, "/init/init/running/open_model/store_metamodel", self)
+        self.states["/init/init/running/open_model/store_metamodel"] = State(44, "/init/init/running/open_model/store_metamodel", self)
         self.states["/init/init/running/open_model/store_metamodel"].setEnter(self._init_init_running_open_model_store_metamodel_enter)
         
         # state /init/init/running/new_rendered
-        self.states["/init/init/running/new_rendered"] = State(42, "/init/init/running/new_rendered", self)
+        self.states["/init/init/running/new_rendered"] = State(45, "/init/init/running/new_rendered", self)
         self.states["/init/init/running/new_rendered"].setEnter(self._init_init_running_new_rendered_enter)
         
         # state /init/init/running/create_new_model
-        self.states["/init/init/running/create_new_model"] = State(43, "/init/init/running/create_new_model", self)
+        self.states["/init/init/running/create_new_model"] = State(46, "/init/init/running/create_new_model", self)
         
         # state /init/init/running/create_new_model/query_metamodel
-        self.states["/init/init/running/create_new_model/query_metamodel"] = State(44, "/init/init/running/create_new_model/query_metamodel", self)
+        self.states["/init/init/running/create_new_model/query_metamodel"] = State(47, "/init/init/running/create_new_model/query_metamodel", self)
         self.states["/init/init/running/create_new_model/query_metamodel"].setEnter(self._init_init_running_create_new_model_query_metamodel_enter)
         
         # state /init/init/running/create_new_model/wait_for_metamodel
-        self.states["/init/init/running/create_new_model/wait_for_metamodel"] = State(45, "/init/init/running/create_new_model/wait_for_metamodel", self)
+        self.states["/init/init/running/create_new_model/wait_for_metamodel"] = State(48, "/init/init/running/create_new_model/wait_for_metamodel", self)
         
         # state /init/init/running/create_new_model/got_mm
-        self.states["/init/init/running/create_new_model/got_mm"] = State(46, "/init/init/running/create_new_model/got_mm", self)
+        self.states["/init/init/running/create_new_model/got_mm"] = State(49, "/init/init/running/create_new_model/got_mm", self)
         
         # state /init/init/running/create_new_model/prompt_model_name
-        self.states["/init/init/running/create_new_model/prompt_model_name"] = State(47, "/init/init/running/create_new_model/prompt_model_name", self)
+        self.states["/init/init/running/create_new_model/prompt_model_name"] = State(50, "/init/init/running/create_new_model/prompt_model_name", self)
         self.states["/init/init/running/create_new_model/prompt_model_name"].setEnter(self._init_init_running_create_new_model_prompt_model_name_enter)
         
         # state /init/init/running/create_new_model/waiting_for_model_name
-        self.states["/init/init/running/create_new_model/waiting_for_model_name"] = State(48, "/init/init/running/create_new_model/waiting_for_model_name", self)
+        self.states["/init/init/running/create_new_model/waiting_for_model_name"] = State(51, "/init/init/running/create_new_model/waiting_for_model_name", self)
         
         # state /init/init/running/create_new_model/creating_model
-        self.states["/init/init/running/create_new_model/creating_model"] = State(49, "/init/init/running/create_new_model/creating_model", self)
+        self.states["/init/init/running/create_new_model/creating_model"] = State(52, "/init/init/running/create_new_model/creating_model", self)
         self.states["/init/init/running/create_new_model/creating_model"].setEnter(self._init_init_running_create_new_model_creating_model_enter)
         
         # state /init/init/running/rerender_model
-        self.states["/init/init/running/rerender_model"] = State(50, "/init/init/running/rerender_model", self)
+        self.states["/init/init/running/rerender_model"] = State(53, "/init/init/running/rerender_model", self)
         
         # state /init/init/running/rerender_model/initial_render
-        self.states["/init/init/running/rerender_model/initial_render"] = State(51, "/init/init/running/rerender_model/initial_render", self)
+        self.states["/init/init/running/rerender_model/initial_render"] = State(54, "/init/init/running/rerender_model/initial_render", self)
         
         # state /init/init/running/rerender_model/recreate_toolbars
-        self.states["/init/init/running/rerender_model/recreate_toolbars"] = State(52, "/init/init/running/rerender_model/recreate_toolbars", self)
+        self.states["/init/init/running/rerender_model/recreate_toolbars"] = State(55, "/init/init/running/rerender_model/recreate_toolbars", self)
         self.states["/init/init/running/rerender_model/recreate_toolbars"].setEnter(self._init_init_running_rerender_model_recreate_toolbars_enter)
         
         # state /init/init/running/rerender_model/recreate_toolbars/waiting
-        self.states["/init/init/running/rerender_model/recreate_toolbars/waiting"] = State(53, "/init/init/running/rerender_model/recreate_toolbars/waiting", self)
+        self.states["/init/init/running/rerender_model/recreate_toolbars/waiting"] = State(56, "/init/init/running/rerender_model/recreate_toolbars/waiting", self)
         
         # state /init/init/running/rerender_model/recreate_toolbars/close_all
-        self.states["/init/init/running/rerender_model/recreate_toolbars/close_all"] = State(54, "/init/init/running/rerender_model/recreate_toolbars/close_all", self)
+        self.states["/init/init/running/rerender_model/recreate_toolbars/close_all"] = State(57, "/init/init/running/rerender_model/recreate_toolbars/close_all", self)
         
         # state /init/init/running/rerender_model/canvas
-        self.states["/init/init/running/rerender_model/canvas"] = State(55, "/init/init/running/rerender_model/canvas", self)
+        self.states["/init/init/running/rerender_model/canvas"] = State(58, "/init/init/running/rerender_model/canvas", self)
         self.states["/init/init/running/rerender_model/canvas"].setEnter(self._init_init_running_rerender_model_canvas_enter)
         
         # state /init/init/running/rerender_model/pack_canvas
-        self.states["/init/init/running/rerender_model/pack_canvas"] = State(56, "/init/init/running/rerender_model/pack_canvas", self)
+        self.states["/init/init/running/rerender_model/pack_canvas"] = State(59, "/init/init/running/rerender_model/pack_canvas", self)
         
         # state /init/init/running/rerender_model/model_toolbars
-        self.states["/init/init/running/rerender_model/model_toolbars"] = State(57, "/init/init/running/rerender_model/model_toolbars", self)
+        self.states["/init/init/running/rerender_model/model_toolbars"] = State(60, "/init/init/running/rerender_model/model_toolbars", self)
         
         # state /init/init/running/rerender_model/model_toolbars/mm_toolbar
-        self.states["/init/init/running/rerender_model/model_toolbars/mm_toolbar"] = State(58, "/init/init/running/rerender_model/model_toolbars/mm_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/mm_toolbar"] = State(61, "/init/init/running/rerender_model/model_toolbars/mm_toolbar", self)
         self.states["/init/init/running/rerender_model/model_toolbars/mm_toolbar"].setEnter(self._init_init_running_rerender_model_model_toolbars_mm_toolbar_enter)
         
         # state /init/init/running/rerender_model/model_toolbars/pack_mm_toolbar
-        self.states["/init/init/running/rerender_model/model_toolbars/pack_mm_toolbar"] = State(59, "/init/init/running/rerender_model/model_toolbars/pack_mm_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/pack_mm_toolbar"] = State(62, "/init/init/running/rerender_model/model_toolbars/pack_mm_toolbar", self)
         
         # state /init/init/running/rerender_model/model_toolbars/cs_toolbar
-        self.states["/init/init/running/rerender_model/model_toolbars/cs_toolbar"] = State(60, "/init/init/running/rerender_model/model_toolbars/cs_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/cs_toolbar"] = State(63, "/init/init/running/rerender_model/model_toolbars/cs_toolbar", self)
         self.states["/init/init/running/rerender_model/model_toolbars/cs_toolbar"].setEnter(self._init_init_running_rerender_model_model_toolbars_cs_toolbar_enter)
         
         # state /init/init/running/rerender_model/model_toolbars/pack_cs_toolbar
-        self.states["/init/init/running/rerender_model/model_toolbars/pack_cs_toolbar"] = State(61, "/init/init/running/rerender_model/model_toolbars/pack_cs_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/pack_cs_toolbar"] = State(64, "/init/init/running/rerender_model/model_toolbars/pack_cs_toolbar", self)
         
         # state /init/init/running/rerender_model/model_toolbars/fetch_types
-        self.states["/init/init/running/rerender_model/model_toolbars/fetch_types"] = State(62, "/init/init/running/rerender_model/model_toolbars/fetch_types", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/fetch_types"] = State(65, "/init/init/running/rerender_model/model_toolbars/fetch_types", self)
         self.states["/init/init/running/rerender_model/model_toolbars/fetch_types"].setEnter(self._init_init_running_rerender_model_model_toolbars_fetch_types_enter)
         
         # state /init/init/running/rerender_model/model_toolbars/dsl_toolbar
-        self.states["/init/init/running/rerender_model/model_toolbars/dsl_toolbar"] = State(63, "/init/init/running/rerender_model/model_toolbars/dsl_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/dsl_toolbar"] = State(66, "/init/init/running/rerender_model/model_toolbars/dsl_toolbar", self)
         
         # state /init/init/running/rerender_model/model_toolbars/pack_dsl_toolbar
-        self.states["/init/init/running/rerender_model/model_toolbars/pack_dsl_toolbar"] = State(64, "/init/init/running/rerender_model/model_toolbars/pack_dsl_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/pack_dsl_toolbar"] = State(67, "/init/init/running/rerender_model/model_toolbars/pack_dsl_toolbar", self)
         
         # state /init/init/running/rerender_model/request_render
-        self.states["/init/init/running/rerender_model/request_render"] = State(65, "/init/init/running/rerender_model/request_render", self)
+        self.states["/init/init/running/rerender_model/request_render"] = State(68, "/init/init/running/rerender_model/request_render", self)
         self.states["/init/init/running/rerender_model/request_render"].setEnter(self._init_init_running_rerender_model_request_render_enter)
         
         # state /init/init/running/rerender_model/render_model
-        self.states["/init/init/running/rerender_model/render_model"] = State(66, "/init/init/running/rerender_model/render_model", self)
+        self.states["/init/init/running/rerender_model/render_model"] = State(69, "/init/init/running/rerender_model/render_model", self)
         self.states["/init/init/running/rerender_model/render_model"].setEnter(self._init_init_running_rerender_model_render_model_enter)
         
         # state /init/init/running/rerender_model/render_model/allocate_groups
-        self.states["/init/init/running/rerender_model/render_model/allocate_groups"] = State(67, "/init/init/running/rerender_model/render_model/allocate_groups", self)
+        self.states["/init/init/running/rerender_model/render_model/allocate_groups"] = State(70, "/init/init/running/rerender_model/render_model/allocate_groups", self)
         
         # state /init/init/running/rerender_model/render_model/allocating_group
-        self.states["/init/init/running/rerender_model/render_model/allocating_group"] = State(68, "/init/init/running/rerender_model/render_model/allocating_group", self)
+        self.states["/init/init/running/rerender_model/render_model/allocating_group"] = State(71, "/init/init/running/rerender_model/render_model/allocating_group", self)
         
         # state /init/init/running/rerender_model/render_model/allocate_contains
-        self.states["/init/init/running/rerender_model/render_model/allocate_contains"] = State(69, "/init/init/running/rerender_model/render_model/allocate_contains", self)
+        self.states["/init/init/running/rerender_model/render_model/allocate_contains"] = State(72, "/init/init/running/rerender_model/render_model/allocate_contains", self)
         
         # state /init/init/running/rerender_model/render_model/render_elements
-        self.states["/init/init/running/rerender_model/render_model/render_elements"] = State(70, "/init/init/running/rerender_model/render_model/render_elements", self)
+        self.states["/init/init/running/rerender_model/render_model/render_elements"] = State(73, "/init/init/running/rerender_model/render_model/render_elements", self)
         
         # state /init/init/close
-        self.states["/init/init/close"] = State(71, "/init/init/close", self)
+        self.states["/init/init/close"] = State(74, "/init/init/close", self)
         self.states["/init/init/close"].setEnter(self._init_init_close_enter)
         
         # state /init/key_status
-        self.states["/init/key_status"] = State(72, "/init/key_status", self)
+        self.states["/init/key_status"] = State(75, "/init/key_status", self)
         self.states["/init/key_status"].setEnter(self._init_key_status_enter)
         
         # state /init/key_status/listening
-        self.states["/init/key_status/listening"] = State(73, "/init/key_status/listening", self)
+        self.states["/init/key_status/listening"] = State(76, "/init/key_status/listening", self)
         
         # add children
         self.states[""].addChild(self.states["/init"])
@@ -4267,6 +4313,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/init/init/init"].addChild(self.states["/init/init/init/progressbar"])
         self.states["/init/init/init"].addChild(self.states["/init/init/init/pack_progressbar"])
         self.states["/init/init/running"].addChild(self.states["/init/init/running/idle"])
+        self.states["/init/init/running"].addChild(self.states["/init/init/running/modify_defined_attrs"])
         self.states["/init/init/running"].addChild(self.states["/init/init/running/add_object_diagrams"])
         self.states["/init/init/running"].addChild(self.states["/init/init/running/upload_MVC"])
         self.states["/init/init/running"].addChild(self.states["/init/init/running/change_metamodel"])
@@ -4279,6 +4326,8 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/init/init/running"].addChild(self.states["/init/init/running/new_rendered"])
         self.states["/init/init/running"].addChild(self.states["/init/init/running/create_new_model"])
         self.states["/init/init/running"].addChild(self.states["/init/init/running/rerender_model"])
+        self.states["/init/init/running/modify_defined_attrs"].addChild(self.states["/init/init/running/modify_defined_attrs/create_window"])
+        self.states["/init/init/running/modify_defined_attrs"].addChild(self.states["/init/init/running/modify_defined_attrs/wait_for_finished"])
         self.states["/init/init/running/add_object_diagrams"].addChild(self.states["/init/init/running/add_object_diagrams/init"])
         self.states["/init/init/running/add_object_diagrams"].addChild(self.states["/init/init/running/add_object_diagrams/modify_render_OD"])
         self.states["/init/init/running/add_object_diagrams/modify_render_OD"].addChild(self.states["/init/init/running/add_object_diagrams/modify_render_OD/exit"])
@@ -4334,6 +4383,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/init/init"].default_state = self.states["/init/init/init"]
         self.states["/init/init/init"].default_state = self.states["/init/init/init/generic_toolbar"]
         self.states["/init/init/running"].default_state = self.states["/init/init/running/idle"]
+        self.states["/init/init/running/modify_defined_attrs"].default_state = self.states["/init/init/running/modify_defined_attrs/create_window"]
         self.states["/init/init/running/add_object_diagrams"].default_state = self.states["/init/init/running/add_object_diagrams/init"]
         self.states["/init/init/running/add_object_diagrams/modify_render_OD"].default_state = self.states["/init/init/running/add_object_diagrams/modify_render_OD/exit"]
         self.states["/init/init/running/upload_MVC"].default_state = self.states["/init/init/running/upload_MVC/load_code"]
@@ -4402,22 +4452,38 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         _init_init_running_idle_8 = Transition(self, self.states["/init/init/running/idle"], [self.states["/init/init/running/add_object_diagrams"]])
         _init_init_running_idle_8.setTrigger(Event("add_object_diagrams", None))
         self.states["/init/init/running/idle"].addTransition(_init_init_running_idle_8)
-        _init_init_running_idle_9 = Transition(self, self.states["/init/init/running/idle"], [self.states["/init/init/running/change_metamodel"]])
+        _init_init_running_idle_9 = Transition(self, self.states["/init/init/running/idle"], [self.states["/init/init/running/modify_defined_attrs"]])
         _init_init_running_idle_9.setAction(self._init_init_running_idle_9_exec)
-        _init_init_running_idle_9.setTrigger(Event("change_metamodel", None))
+        _init_init_running_idle_9.setTrigger(Event("modify_defined_attrs", None))
         self.states["/init/init/running/idle"].addTransition(_init_init_running_idle_9)
-        _init_init_running_idle_10 = Transition(self, self.states["/init/init/running/idle"], [self.states["/init/init/running/change_mapper"]])
+        _init_init_running_idle_10 = Transition(self, self.states["/init/init/running/idle"], [self.states["/init/init/running/change_metamodel"]])
         _init_init_running_idle_10.setAction(self._init_init_running_idle_10_exec)
-        _init_init_running_idle_10.setTrigger(Event("change_mapper", None))
+        _init_init_running_idle_10.setTrigger(Event("change_metamodel", None))
         self.states["/init/init/running/idle"].addTransition(_init_init_running_idle_10)
-        _init_init_running_idle_11 = Transition(self, self.states["/init/init/running/idle"], [self.states["/init/init/running/change_rendered"]])
+        _init_init_running_idle_11 = Transition(self, self.states["/init/init/running/idle"], [self.states["/init/init/running/change_mapper"]])
         _init_init_running_idle_11.setAction(self._init_init_running_idle_11_exec)
-        _init_init_running_idle_11.setTrigger(Event("change_rendered", None))
+        _init_init_running_idle_11.setTrigger(Event("change_mapper", None))
         self.states["/init/init/running/idle"].addTransition(_init_init_running_idle_11)
-        _init_init_running_idle_12 = Transition(self, self.states["/init/init/running/idle"], [self.states["/init/init/running/idle"]])
+        _init_init_running_idle_12 = Transition(self, self.states["/init/init/running/idle"], [self.states["/init/init/running/change_rendered"]])
         _init_init_running_idle_12.setAction(self._init_init_running_idle_12_exec)
-        _init_init_running_idle_12.setTrigger(Event("select_for_creation", None))
+        _init_init_running_idle_12.setTrigger(Event("change_rendered", None))
         self.states["/init/init/running/idle"].addTransition(_init_init_running_idle_12)
+        _init_init_running_idle_13 = Transition(self, self.states["/init/init/running/idle"], [self.states["/init/init/running/idle"]])
+        _init_init_running_idle_13.setAction(self._init_init_running_idle_13_exec)
+        _init_init_running_idle_13.setTrigger(Event("select_for_creation", None))
+        self.states["/init/init/running/idle"].addTransition(_init_init_running_idle_13)
+        
+        # transition /init/init/running/modify_defined_attrs/create_window
+        _init_init_running_modify_defined_attrs_create_window_0 = Transition(self, self.states["/init/init/running/modify_defined_attrs/create_window"], [self.states["/init/init/running/modify_defined_attrs/wait_for_finished"]])
+        _init_init_running_modify_defined_attrs_create_window_0.setAction(self._init_init_running_modify_defined_attrs_create_window_0_exec)
+        _init_init_running_modify_defined_attrs_create_window_0.setTrigger(Event("instance_created", None))
+        self.states["/init/init/running/modify_defined_attrs/create_window"].addTransition(_init_init_running_modify_defined_attrs_create_window_0)
+        
+        # transition /init/init/running/modify_defined_attrs/wait_for_finished
+        _init_init_running_modify_defined_attrs_wait_for_finished_0 = Transition(self, self.states["/init/init/running/modify_defined_attrs/wait_for_finished"], [self.states["/init/init/running/rerender_model"]])
+        _init_init_running_modify_defined_attrs_wait_for_finished_0.setAction(self._init_init_running_modify_defined_attrs_wait_for_finished_0_exec)
+        _init_init_running_modify_defined_attrs_wait_for_finished_0.setTrigger(Event("close_window", None))
+        self.states["/init/init/running/modify_defined_attrs/wait_for_finished"].addTransition(_init_init_running_modify_defined_attrs_wait_for_finished_0)
         
         # transition /init/init/running/add_object_diagrams/init
         _init_init_running_add_object_diagrams_init_0 = Transition(self, self.states["/init/init/running/add_object_diagrams/init"], [self.states["/init/init/running/add_object_diagrams/modify_render_OD"]])
@@ -4824,6 +4890,9 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def _init_init_running_idle_enter(self):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [0, 'Ready for action!'])]))
     
+    def _init_init_running_modify_defined_attrs_create_window_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'subwindow', 'AttributeEditor', current_model, self.as_element]))
+    
     def _init_init_running_add_object_diagrams_init_enter(self):
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['transformation_add_AL', [{'rendered': 'formalisms/MM_render', 'abstract': current_metamodel}, {'rendered': 'formalisms/MM_render'}, 'models/render_OD/' + current_metamodel, open('models/render_OD.alc', 'r').read()]])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [10, 'Adding transformation...'])]))
@@ -4932,25 +5001,37 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         return current_mapper is not None
     
     def _init_init_running_idle_9_exec(self, parameters):
+        as_element = parameters[0]
+        self.as_element = as_element
+    
+    def _init_init_running_idle_10_exec(self, parameters):
         new_metamodel = parameters[0]
         global current_metamodel
         current_metamodel = new_metamodel
     
-    def _init_init_running_idle_10_exec(self, parameters):
+    def _init_init_running_idle_11_exec(self, parameters):
         new_mapper = parameters[0]
         global current_mapper
         current_mapper = new_mapper
         print("Switch mapper to " + str(new_mapper))
     
-    def _init_init_running_idle_11_exec(self, parameters):
+    def _init_init_running_idle_12_exec(self, parameters):
         new_rendered = parameters[0]
         global current_rendered_model
         current_rendered_model = new_rendered
     
-    def _init_init_running_idle_12_exec(self, parameters):
+    def _init_init_running_idle_13_exec(self, parameters):
         element_name = parameters[0]
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'canvas', Event("select_for_creation", None, [element_name])]))
     
+    def _init_init_running_modify_defined_attrs_create_window_0_exec(self, parameters):
+        assoc_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, assoc_name]))
+        self.current_window = assoc_name
+    
+    def _init_init_running_modify_defined_attrs_wait_for_finished_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, self.current_window]))
+    
     def _init_init_running_add_object_diagrams_init_0_exec(self, parameters):
         context = parameters[0]
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [25, 'Switching contexts...'])]))
@@ -7588,7 +7669,6 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         
         # state /ready/process_events/creating_line/create_in_mv/check_types
         self.states["/ready/process_events/creating_line/create_in_mv/check_types"] = State(9, "/ready/process_events/creating_line/create_in_mv/check_types", self)
-        self.states["/ready/process_events/creating_line/create_in_mv/check_types"].setEnter(self._ready_process_events_creating_line_create_in_mv_check_types_enter)
         
         # state /ready/process_events/creating_line/create_in_mv/request_user
         self.states["/ready/process_events/creating_line/create_in_mv/request_user"] = State(10, "/ready/process_events/creating_line/create_in_mv/request_user", self)
@@ -7709,6 +7789,10 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         _ready_process_events_ready_8.setAction(self._ready_process_events_ready_8_exec)
         _ready_process_events_ready_8.setTrigger(Event("moved_group", None))
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_8)
+        _ready_process_events_ready_9 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
+        _ready_process_events_ready_9.setAction(self._ready_process_events_ready_9_exec)
+        _ready_process_events_ready_9.setTrigger(Event("deleted_group", None))
+        self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_9)
         
         # transition /ready/process_events/creating_line/drawing
         _ready_process_events_creating_line_drawing_0 = Transition(self, self.states["/ready/process_events/creating_line/drawing"], [self.states["/ready/process_events/creating_line/drawing"]])
@@ -7835,9 +7919,6 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
     def _ready_process_events_creating_line_create_in_mv_query_type_enter(self):
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['connections_between', [current_model, self.creating_line[1], self.creating_line[3]]])]))
     
-    def _ready_process_events_creating_line_create_in_mv_check_types_enter(self):
-        print("Got allowed types: " + str(self.allowed_types))
-    
     def _ready_process_events_creating_line_create_in_mv_request_user_convert_to_name_enter(self):
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['read_attrs', [current_metamodel, self.allowed_types[0]]])]))
     
@@ -7926,6 +8007,11 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         self.group_location[group_element] = new_location
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'connecting_lines', Event("moved_element", None, [group_element, new_location])]))
     
+    def _ready_process_events_ready_9_exec(self, parameters):
+        group_element = parameters[0]
+        del self.group_location[group_element]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'connecting_lines', Event("deleted_element", None, [group_element])]))
+    
     def _ready_process_events_creating_line_drawing_0_exec(self, parameters):
         x, y, _, _ = self.coords(self.tmp_line)
         
@@ -8155,9 +8241,19 @@ class ConnectingLine(RuntimeClassBase, SCCDWidget):
         self.states["/main"].addTransition(_main_1)
         _main_2 = Transition(self, self.states["/main"], [self.states["/main"]])
         _main_2.setAction(self._main_2_exec)
-        _main_2.setTrigger(Event("moved_element", None))
+        _main_2.setTrigger(Event("middle-click", None))
         _main_2.setGuard(self._main_2_guard)
         self.states["/main"].addTransition(_main_2)
+        _main_3 = Transition(self, self.states["/main"], [self.states["/main"]])
+        _main_3.setAction(self._main_3_exec)
+        _main_3.setTrigger(Event("moved_element", None))
+        _main_3.setGuard(self._main_3_guard)
+        self.states["/main"].addTransition(_main_3)
+        _main_4 = Transition(self, self.states["/main"], [self.states["/main"]])
+        _main_4.setAction(self._main_4_exec)
+        _main_4.setTrigger(Event("deleted_element", None))
+        _main_4.setGuard(self._main_4_guard)
+        self.states["/main"].addTransition(_main_4)
         
         # transition /update_attrs/query
         _update_attrs_query_0 = Transition(self, self.states["/update_attrs/query"], [self.states["/update_attrs/prompt"]])
@@ -8252,7 +8348,6 @@ class ConnectingLine(RuntimeClassBase, SCCDWidget):
     
     def _main_1_exec(self, parameters):
         ID = parameters[0]
-        print("Right click in element " + str(self.cs_element))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("create_line", None, [self.cs_element['id'], self.as_element, (self.last_x, self.last_y)])]))
     
     def _main_1_guard(self, parameters):
@@ -8260,6 +8355,14 @@ class ConnectingLine(RuntimeClassBase, SCCDWidget):
         return id(self) == ID and not control_pressed
     
     def _main_2_exec(self, parameters):
+        ID = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/parent', Event("modify_defined_attrs", None, [self.as_element])]))
+    
+    def _main_2_guard(self, parameters):
+        ID = parameters[0]
+        return id(self) == ID and control_pressed
+    
+    def _main_3_exec(self, parameters):
         element = parameters[0]
         new_location = parameters[1]
         source_x, source_y, _, _ = self.containing_canvas.coords(self.cs_element['elem'][0])
@@ -8282,11 +8385,22 @@ class ConnectingLine(RuntimeClassBase, SCCDWidget):
         self.containing_canvas.coords(self.cs_element['elem'][1], self.middle_x, self.middle_y, target_x, target_y)
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("moved_group", None, [self.cs_element['id'], (self.middle_x, self.middle_y)])]))
     
-    def _main_2_guard(self, parameters):
+    def _main_3_guard(self, parameters):
         element = parameters[0]
         new_location = parameters[1]
         return element == self.cs_element['__source'] or element == self.cs_element['__target']
     
+    def _main_4_exec(self, parameters):
+        element = parameters[0]
+        for f in self.elements:
+            self.containing_canvas.delete(f)
+        self.elements = {}
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("deleted_group", None, [self.cs_element['id']])]))
+    
+    def _main_4_guard(self, parameters):
+        element = parameters[0]
+        return element == self.cs_element['__source'] or element == self.cs_element['__target']
+    
     def _update_attrs_query_0_exec(self, parameters):
         result = parameters[0]
         self.prev_results = result
@@ -8526,13 +8640,18 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
         self.states["/main"].addTransition(_main_2)
         _main_3 = Transition(self, self.states["/main"], [self.states["/main"]])
         _main_3.setAction(self._main_3_exec)
-        _main_3.setTrigger(Event("right-click", None))
+        _main_3.setTrigger(Event("middle-click", None))
         _main_3.setGuard(self._main_3_guard)
         self.states["/main"].addTransition(_main_3)
-        _main_4 = Transition(self, self.states["/main"], [self.states["/remove_element"]])
+        _main_4 = Transition(self, self.states["/main"], [self.states["/main"]])
+        _main_4.setAction(self._main_4_exec)
         _main_4.setTrigger(Event("right-click", None))
         _main_4.setGuard(self._main_4_guard)
         self.states["/main"].addTransition(_main_4)
+        _main_5 = Transition(self, self.states["/main"], [self.states["/remove_element"]])
+        _main_5.setTrigger(Event("right-click", None))
+        _main_5.setGuard(self._main_5_guard)
+        self.states["/main"].addTransition(_main_5)
         
         # transition /remove_element
         _remove_element_0 = Transition(self, self.states["/remove_element"], [self.states["/main"]])
@@ -8621,6 +8740,7 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
     
     def _remove_element_enter(self):
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['delete_element', [current_model, self.as_element]])]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("deleted_group", None, [self.cs_element])]))
         for f in self.elements:
             self.containing_canvas.delete(f)
         self.elements = {}
@@ -8686,14 +8806,21 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
     
     def _main_3_exec(self, parameters):
         ID = parameters[0]
-        print("Right click in element " + str(self.cs_element))
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("create_line", None, [self.cs_element, self.as_element, (self.last_x, self.last_y)])]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/parent', Event("modify_defined_attrs", None, [self.as_element])]))
     
     def _main_3_guard(self, parameters):
         ID = parameters[0]
-        return id(self) == ID and not control_pressed
+        return id(self) == ID and control_pressed
+    
+    def _main_4_exec(self, parameters):
+        ID = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("create_line", None, [self.cs_element, self.as_element, (self.last_x, self.last_y)])]))
     
     def _main_4_guard(self, parameters):
+        ID = parameters[0]
+        return id(self) == ID and not control_pressed
+    
+    def _main_5_guard(self, parameters):
         ID = parameters[0]
         return id(self) == ID and control_pressed