Browse Source

Fix changing the type of an attribute

Yentl Van Tendeloo 8 years ago
parent
commit
b9f8c7cd2c

+ 1 - 0
classes/canvas/canvas_element.xml

@@ -145,6 +145,7 @@
                 <parameter name="ID"/>
                 <raise event="modify_defined_attrs" scope="narrow" target="'parent/parent'">
                     <parameter expr="self.as_element"/>
+                    <parameter expr="self.cs_element"/>
                 </raise>
             </transition>
 

+ 61 - 1
classes/modelverse/modelverse.xml

@@ -1261,6 +1261,48 @@
                         </transition>
                     </state>
 
+                    <state id="attr_type">
+                        <onentry>
+                            <raise event="request">
+                                <parameter expr="['attr_type', self.parameters[1], self.parameters[2], self.parameters[3]]"/>
+                            </raise>
+                        </onentry>
+
+                        <transition cond="self.expect_response('Success')" target="../../wait_for_action/history">
+                            <raise event="result">
+                                <parameter expr="None"/>
+                            </raise>
+                        </transition>
+                    </state>
+
+                    <state id="attr_name">
+                        <onentry>
+                            <raise event="request">
+                                <parameter expr="['attr_name', self.parameters[1], self.parameters[2], self.parameters[3]]"/>
+                            </raise>
+                        </onentry>
+
+                        <transition cond="self.expect_response('Success')" target="../../wait_for_action/history">
+                            <raise event="result">
+                                <parameter expr="None"/>
+                            </raise>
+                        </transition>
+                    </state>
+
+                    <state id="attr_optional">
+                        <onentry>
+                            <raise event="request">
+                                <parameter expr="['attr_optional', self.parameters[1], self.parameters[2], self.parameters[3]]"/>
+                            </raise>
+                        </onentry>
+
+                        <transition cond="self.expect_response('Success')" target="../../wait_for_action/history">
+                            <raise event="result">
+                                <parameter expr="None"/>
+                            </raise>
+                        </transition>
+                    </state>
+
                     <state id="read_outgoing">
                         <onentry>
                             <raise event="request">
@@ -1634,7 +1676,7 @@
                             </script>
                         </transition>
 
-                        <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 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', 'attr_optional', 'attr_type', 'attr_name'])" target="../../going_manual">
                         </transition>
                     </state>
 
@@ -1732,6 +1774,24 @@
                                 </script>
                             </transition>
 
+                            <transition cond="self.expect_action(self.context, 'attr_name')" target="../../../operations/attr_name">
+                                <script>
+                                    self.load_action(self.context)
+                                </script>
+                            </transition>
+
+                            <transition cond="self.expect_action(self.context, 'attr_type')" target="../../../operations/attr_type">
+                                <script>
+                                    self.load_action(self.context)
+                                </script>
+                            </transition>
+
+                            <transition cond="self.expect_action(self.context, 'attr_optional')" target="../../../operations/attr_optional">
+                                <script>
+                                    self.load_action(self.context)
+                                </script>
+                            </transition>
+
                             <transition cond="self.expect_action(self.context, 'read_outgoing')" target="../../../operations/read_outgoing">
                                 <script>
                                     self.load_action(self.context)

+ 3 - 3
classes/window/attribute_editor.xml

@@ -409,7 +409,7 @@
                 <onentry>
                     <raise event="mv_request" scope="broad">
                         <parameter expr="'attr_optional'"/>
-                        <parameter expr="[current_model, self.as_element, self.parameter]"/>
+                        <parameter expr="[current_model, self.as_element, self.parameter, True]"/>
                     </raise>
                 </onentry>
 
@@ -421,8 +421,8 @@
             <state id="make_mandatory">
                 <onentry>
                     <raise event="mv_request" scope="broad">
-                        <parameter expr="'attr_mandatory'"/>
-                        <parameter expr="[current_model, self.as_element, self.parameter]"/>
+                        <parameter expr="'attr_optional'"/>
+                        <parameter expr="[current_model, self.as_element, self.parameter, False]"/>
                     </raise>
                 </onentry>
 

+ 14 - 1
classes/window/main_window.xml

@@ -115,8 +115,10 @@
                         <transition event="add_object_diagrams" target="../add_object_diagrams"/>
                         <transition event="modify_defined_attrs" target="../modify_defined_attrs">
                             <parameter name="as_element"/>
+                            <parameter name="cs_element"/>
                             <script>
                                 self.as_element = as_element
+                                self.cs_element = cs_element
                             </script>
                         </transition>
 
@@ -172,12 +174,23 @@
                         </state>
 
                         <state id="wait_for_finished">
-                            <transition event="close_window" target="../../rerender_model">
+                            <transition event="close_window" target="../mark_dirty">
                                 <raise event="delete_instance" scope="cd">
                                     <parameter expr="self.current_window"/>
                                 </raise>
                             </transition>
                         </state>
+
+                        <state id="mark_dirty">
+                            <onentry>
+                                <raise event="mv_request" scope="broad">
+                                    <parameter expr="'attr_assign'"/>
+                                    <parameter expr="[current_rendered_model, self.cs_element, 'dirty', True]"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="mv_response" target="../../rerender_model"/>
+                        </state>
                     </state>
 
                     <state id="add_object_diagrams" initial="init">

+ 219 - 108
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:   Fri Oct 13 10:28:24 2017
+Date:   Fri Oct 13 11:46:31 2017
 
 Model author: Yentl Van Tendeloo
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -923,85 +923,97 @@ class Modelverse(RuntimeClassBase):
         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/attr_type
+        self.states["/initialized/behaviour/operations/attr_type"] = State(100, "/initialized/behaviour/operations/attr_type", self)
+        self.states["/initialized/behaviour/operations/attr_type"].setEnter(self._initialized_behaviour_operations_attr_type_enter)
+        
+        # state /initialized/behaviour/operations/attr_name
+        self.states["/initialized/behaviour/operations/attr_name"] = State(101, "/initialized/behaviour/operations/attr_name", self)
+        self.states["/initialized/behaviour/operations/attr_name"].setEnter(self._initialized_behaviour_operations_attr_name_enter)
+        
+        # state /initialized/behaviour/operations/attr_optional
+        self.states["/initialized/behaviour/operations/attr_optional"] = State(102, "/initialized/behaviour/operations/attr_optional", self)
+        self.states["/initialized/behaviour/operations/attr_optional"].setEnter(self._initialized_behaviour_operations_attr_optional_enter)
+        
         # state /initialized/behaviour/operations/read_outgoing
-        self.states["/initialized/behaviour/operations/read_outgoing"] = State(100, "/initialized/behaviour/operations/read_outgoing", self)
+        self.states["/initialized/behaviour/operations/read_outgoing"] = State(103, "/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(101, "/initialized/behaviour/operations/read_incoming", self)
+        self.states["/initialized/behaviour/operations/read_incoming"] = State(104, "/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(102, "/initialized/behaviour/operations/read_association_source", self)
+        self.states["/initialized/behaviour/operations/read_association_source"] = State(105, "/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(103, "/initialized/behaviour/operations/read_association_destination", self)
+        self.states["/initialized/behaviour/operations/read_association_destination"] = State(106, "/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(104, "/initialized/behaviour/operations/connections_between", self)
+        self.states["/initialized/behaviour/operations/connections_between"] = State(107, "/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(105, "/initialized/behaviour/operations/define_attribute", self)
+        self.states["/initialized/behaviour/operations/define_attribute"] = State(108, "/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(106, "/initialized/behaviour/operations/all_instances", self)
+        self.states["/initialized/behaviour/operations/all_instances"] = State(109, "/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(107, "/initialized/behaviour/operations/save", self)
+        self.states["/initialized/behaviour/operations/save"] = State(110, "/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(108, "/initialized/behaviour/wait_for_action", self)
+        self.states["/initialized/behaviour/wait_for_action"] = State(111, "/initialized/behaviour/wait_for_action", self)
         
         # state /initialized/behaviour/wait_for_action/disconnected
-        self.states["/initialized/behaviour/wait_for_action/disconnected"] = State(109, "/initialized/behaviour/wait_for_action/disconnected", self)
+        self.states["/initialized/behaviour/wait_for_action/disconnected"] = State(112, "/initialized/behaviour/wait_for_action/disconnected", self)
         
         # state /initialized/behaviour/wait_for_action/connected
-        self.states["/initialized/behaviour/wait_for_action/connected"] = State(110, "/initialized/behaviour/wait_for_action/connected", self)
+        self.states["/initialized/behaviour/wait_for_action/connected"] = State(113, "/initialized/behaviour/wait_for_action/connected", self)
         
         # state /initialized/behaviour/wait_for_action/megamodelling
-        self.states["/initialized/behaviour/wait_for_action/megamodelling"] = State(111, "/initialized/behaviour/wait_for_action/megamodelling", self)
+        self.states["/initialized/behaviour/wait_for_action/megamodelling"] = State(114, "/initialized/behaviour/wait_for_action/megamodelling", self)
         
         # state /initialized/behaviour/wait_for_action/modelling
-        self.states["/initialized/behaviour/wait_for_action/modelling"] = State(112, "/initialized/behaviour/wait_for_action/modelling", self)
+        self.states["/initialized/behaviour/wait_for_action/modelling"] = State(115, "/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(113, "/initialized/behaviour/wait_for_action/modelling/recognized", self)
+        self.states["/initialized/behaviour/wait_for_action/modelling/recognized"] = State(116, "/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(114, "/initialized/behaviour/wait_for_action/modelling/recognized/manual", self)
+        self.states["/initialized/behaviour/wait_for_action/modelling/recognized/manual"] = State(117, "/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(115, "/initialized/behaviour/wait_for_action/modelling/recognized/scripted", self)
+        self.states["/initialized/behaviour/wait_for_action/modelling/recognized/scripted"] = State(118, "/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(116, "/initialized/behaviour/wait_for_action/finished", self)
+        self.states["/initialized/behaviour/wait_for_action/finished"] = State(119, "/initialized/behaviour/wait_for_action/finished", self)
         
         # state /initialized/behaviour/wait_for_action/history
-        self.states["/initialized/behaviour/wait_for_action/history"] = DeepHistoryState(117, "/initialized/behaviour/wait_for_action/history", self)
+        self.states["/initialized/behaviour/wait_for_action/history"] = DeepHistoryState(120, "/initialized/behaviour/wait_for_action/history", self)
         
         # state /initialized/behaviour/going_manual
-        self.states["/initialized/behaviour/going_manual"] = State(118, "/initialized/behaviour/going_manual", self)
+        self.states["/initialized/behaviour/going_manual"] = State(121, "/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(119, "/initialized/behaviour/going_scripted", self)
+        self.states["/initialized/behaviour/going_scripted"] = State(122, "/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(120, "/initialized/behaviour/leaving_manual", self)
+        self.states["/initialized/behaviour/leaving_manual"] = State(123, "/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(121, "/initialized/queue", self)
+        self.states["/initialized/queue"] = State(124, "/initialized/queue", self)
         
         # state /initialized/queue/queue
-        self.states["/initialized/queue/queue"] = State(122, "/initialized/queue/queue", self)
+        self.states["/initialized/queue/queue"] = State(125, "/initialized/queue/queue", self)
         
         # add children
         self.states[""].addChild(self.states["/init"])
@@ -1065,6 +1077,9 @@ class Modelverse(RuntimeClassBase):
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/attr_assign"])
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/attr_assign_code"])
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/attr_delete"])
+        self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/attr_type"])
+        self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/attr_name"])
+        self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/attr_optional"])
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/read_outgoing"])
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/read_incoming"])
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/read_association_source"])
@@ -1759,6 +1774,27 @@ class Modelverse(RuntimeClassBase):
         _initialized_behaviour_operations_attr_delete_0.setGuard(self._initialized_behaviour_operations_attr_delete_0_guard)
         self.states["/initialized/behaviour/operations/attr_delete"].addTransition(_initialized_behaviour_operations_attr_delete_0)
         
+        # transition /initialized/behaviour/operations/attr_type
+        _initialized_behaviour_operations_attr_type_0 = Transition(self, self.states["/initialized/behaviour/operations/attr_type"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_attr_type_0.setAction(self._initialized_behaviour_operations_attr_type_0_exec)
+        _initialized_behaviour_operations_attr_type_0.setTrigger(None)
+        _initialized_behaviour_operations_attr_type_0.setGuard(self._initialized_behaviour_operations_attr_type_0_guard)
+        self.states["/initialized/behaviour/operations/attr_type"].addTransition(_initialized_behaviour_operations_attr_type_0)
+        
+        # transition /initialized/behaviour/operations/attr_name
+        _initialized_behaviour_operations_attr_name_0 = Transition(self, self.states["/initialized/behaviour/operations/attr_name"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_attr_name_0.setAction(self._initialized_behaviour_operations_attr_name_0_exec)
+        _initialized_behaviour_operations_attr_name_0.setTrigger(None)
+        _initialized_behaviour_operations_attr_name_0.setGuard(self._initialized_behaviour_operations_attr_name_0_guard)
+        self.states["/initialized/behaviour/operations/attr_name"].addTransition(_initialized_behaviour_operations_attr_name_0)
+        
+        # transition /initialized/behaviour/operations/attr_optional
+        _initialized_behaviour_operations_attr_optional_0 = Transition(self, self.states["/initialized/behaviour/operations/attr_optional"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_attr_optional_0.setAction(self._initialized_behaviour_operations_attr_optional_0_exec)
+        _initialized_behaviour_operations_attr_optional_0.setTrigger(None)
+        _initialized_behaviour_operations_attr_optional_0.setGuard(self._initialized_behaviour_operations_attr_optional_0_guard)
+        self.states["/initialized/behaviour/operations/attr_optional"].addTransition(_initialized_behaviour_operations_attr_optional_0)
+        
         # transition /initialized/behaviour/operations/read_outgoing
         _initialized_behaviour_operations_read_outgoing_0 = Transition(self, self.states["/initialized/behaviour/operations/read_outgoing"], [self.states["/initialized/behaviour/wait_for_action/history"]])
         _initialized_behaviour_operations_read_outgoing_0.setAction(self._initialized_behaviour_operations_read_outgoing_0_exec)
@@ -2201,46 +2237,61 @@ class Modelverse(RuntimeClassBase):
         _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_outgoing"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_13 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/attr_name"]])
         _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_incoming"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_14 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/attr_type"]])
         _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_source"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_15 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/attr_optional"]])
         _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/read_association_destination"]])
+        _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_outgoing"]])
         _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/connections_between"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_17 = 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_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/define_attribute"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_18 = 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_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/all_instances"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_19 = 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_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 = 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_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)
+        _initialized_behaviour_wait_for_action_modelling_recognized_21 = 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_21.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_21_exec)
+        _initialized_behaviour_wait_for_action_modelling_recognized_21.setTrigger(None)
+        _initialized_behaviour_wait_for_action_modelling_recognized_21.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_21_guard)
+        self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_21)
+        _initialized_behaviour_wait_for_action_modelling_recognized_22 = 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_22.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_22_exec)
+        _initialized_behaviour_wait_for_action_modelling_recognized_22.setTrigger(None)
+        _initialized_behaviour_wait_for_action_modelling_recognized_22.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_22_guard)
+        self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_22)
+        _initialized_behaviour_wait_for_action_modelling_recognized_23 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/save"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_23.setAction(self._initialized_behaviour_wait_for_action_modelling_recognized_23_exec)
+        _initialized_behaviour_wait_for_action_modelling_recognized_23.setTrigger(None)
+        _initialized_behaviour_wait_for_action_modelling_recognized_23.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_23_guard)
+        self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_23)
     
     def _initialized_enter(self):
         self.raiseInternalEvent(Event("ready", None, []))
@@ -2425,6 +2476,15 @@ class Modelverse(RuntimeClassBase):
     def _initialized_behaviour_operations_attr_delete_enter(self):
         self.raiseInternalEvent(Event("request", None, [['attr_delete', self.parameters[1], self.parameters[2]]]))
     
+    def _initialized_behaviour_operations_attr_type_enter(self):
+        self.raiseInternalEvent(Event("request", None, [['attr_type', self.parameters[1], self.parameters[2], self.parameters[3]]]))
+    
+    def _initialized_behaviour_operations_attr_name_enter(self):
+        self.raiseInternalEvent(Event("request", None, [['attr_name', self.parameters[1], self.parameters[2], self.parameters[3]]]))
+    
+    def _initialized_behaviour_operations_attr_optional_enter(self):
+        self.raiseInternalEvent(Event("request", None, [['attr_optional', self.parameters[1], self.parameters[2], self.parameters[3]]]))
+    
     def _initialized_behaviour_operations_read_outgoing_enter(self):
         self.raiseInternalEvent(Event("request", None, [['read_outgoing', self.parameters[1], self.parameters[2]]]))
     
@@ -2591,48 +2651,66 @@ class Modelverse(RuntimeClassBase):
         self.load_action(self.context)
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_13_guard(self, parameters):
-        return self.expect_action(self.context, 'read_outgoing')
+        return self.expect_action(self.context, 'attr_name')
     
     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_incoming')
+        return self.expect_action(self.context, 'attr_type')
     
     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_source')
+        return self.expect_action(self.context, 'attr_optional')
     
     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, 'read_association_destination')
+        return self.expect_action(self.context, 'read_outgoing')
     
     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, 'connections_between')
+        return self.expect_action(self.context, 'read_incoming')
     
     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, 'define_attribute')
+        return self.expect_action(self.context, 'read_association_source')
     
     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')
+        return self.expect_action(self.context, 'read_association_destination')
     
     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, 'connections_between')
+    
+    def _initialized_behaviour_wait_for_action_modelling_recognized_21_exec(self, parameters):
+        self.load_action(self.context)
+    
+    def _initialized_behaviour_wait_for_action_modelling_recognized_21_guard(self, parameters):
+        return self.expect_action(self.context, 'define_attribute')
+    
+    def _initialized_behaviour_wait_for_action_modelling_recognized_22_exec(self, parameters):
+        self.load_action(self.context)
+    
+    def _initialized_behaviour_wait_for_action_modelling_recognized_22_guard(self, parameters):
+        return self.expect_action(self.context, 'all_instances')
+    
+    def _initialized_behaviour_wait_for_action_modelling_recognized_23_exec(self, parameters):
+        self.load_action(self.context)
+    
+    def _initialized_behaviour_wait_for_action_modelling_recognized_23_guard(self, parameters):
         return self.expect_action(self.context, 'save')
     
     def _init_0_exec(self, parameters):
@@ -3165,6 +3243,24 @@ class Modelverse(RuntimeClassBase):
     def _initialized_behaviour_operations_attr_delete_0_guard(self, parameters):
         return self.expect_response('Success')
     
+    def _initialized_behaviour_operations_attr_type_0_exec(self, parameters):
+        self.raiseInternalEvent(Event("result", None, [None]))
+    
+    def _initialized_behaviour_operations_attr_type_0_guard(self, parameters):
+        return self.expect_response('Success')
+    
+    def _initialized_behaviour_operations_attr_name_0_exec(self, parameters):
+        self.raiseInternalEvent(Event("result", None, [None]))
+    
+    def _initialized_behaviour_operations_attr_name_0_guard(self, parameters):
+        return self.expect_response('Success')
+    
+    def _initialized_behaviour_operations_attr_optional_0_exec(self, parameters):
+        self.raiseInternalEvent(Event("result", None, [None]))
+    
+    def _initialized_behaviour_operations_attr_optional_0_guard(self, parameters):
+        return self.expect_response('Success')
+    
     def _initialized_behaviour_operations_read_outgoing_0_exec(self, parameters):
         self.raiseInternalEvent(Event("result", None, [set(self.split_response(self.responses.pop(0)))]))
     
@@ -3442,7 +3538,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', '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'])
+        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', 'attr_optional', 'attr_type', 'attr_name'])
     
     def _initialized_behaviour_wait_for_action_modelling_recognized_manual_0_guard(self, parameters):
         return self.expect_action(self.context, 'exit')
@@ -4287,10 +4383,10 @@ class AttributeEditor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_model, self.as_element, self.attr_modify['name'], self.attr_modify['type'], self.attr_modify['optional']]])]))
     
     def _all_make_optional_enter(self):
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_optional', [current_model, self.as_element, self.parameter]])]))
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_optional', [current_model, self.as_element, self.parameter, True]])]))
     
     def _all_make_mandatory_enter(self):
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_mandatory', [current_model, self.as_element, self.parameter]])]))
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_optional', [current_model, self.as_element, self.parameter, False]])]))
     
     def _all_delete_entry_enter(self):
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_del', [current_model, self.as_element, self.parameter]])]))
@@ -4713,224 +4809,228 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         # 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/modify_defined_attrs/mark_dirty
+        self.states["/init/init/running/modify_defined_attrs/mark_dirty"] = State(13, "/init/init/running/modify_defined_attrs/mark_dirty", self)
+        self.states["/init/init/running/modify_defined_attrs/mark_dirty"].setEnter(self._init_init_running_modify_defined_attrs_mark_dirty_enter)
+        
         # state /init/init/running/add_object_diagrams
-        self.states["/init/init/running/add_object_diagrams"] = State(13, "/init/init/running/add_object_diagrams", self)
+        self.states["/init/init/running/add_object_diagrams"] = State(14, "/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(14, "/init/init/running/add_object_diagrams/init", self)
+        self.states["/init/init/running/add_object_diagrams/init"] = State(15, "/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(15, "/init/init/running/add_object_diagrams/modify_render_OD", self)
+        self.states["/init/init/running/add_object_diagrams/modify_render_OD"] = State(16, "/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(16, "/init/init/running/add_object_diagrams/modify_render_OD/exit", self)
+        self.states["/init/init/running/add_object_diagrams/modify_render_OD/exit"] = State(17, "/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(17, "/init/init/running/upload_MVC", self)
+        self.states["/init/init/running/upload_MVC"] = State(18, "/init/init/running/upload_MVC", self)
         
         # state /init/init/running/upload_MVC/load_code
-        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"] = State(19, "/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(19, "/init/init/running/upload_MVC/overwriting_model", self)
+        self.states["/init/init/running/upload_MVC/overwriting_model"] = State(20, "/init/init/running/upload_MVC/overwriting_model", self)
         
         # state /init/init/running/change_metamodel
-        self.states["/init/init/running/change_metamodel"] = State(20, "/init/init/running/change_metamodel", self)
+        self.states["/init/init/running/change_metamodel"] = State(21, "/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(21, "/init/init/running/conf_bottom", self)
+        self.states["/init/init/running/conf_bottom"] = State(22, "/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(22, "/init/init/running/conf_bottom/check_if_exists", self)
+        self.states["/init/init/running/conf_bottom/check_if_exists"] = State(23, "/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(23, "/init/init/running/conf_bottom/add_bottom", self)
+        self.states["/init/init/running/conf_bottom/add_bottom"] = State(24, "/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(24, "/init/init/running/custom_MM", self)
+        self.states["/init/init/running/custom_MM"] = State(25, "/init/init/running/custom_MM", self)
         
         # state /init/init/running/custom_MM/query
-        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"] = State(26, "/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(26, "/init/init/running/custom_MM/wait_for_metamodel", self)
+        self.states["/init/init/running/custom_MM/wait_for_metamodel"] = State(27, "/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(27, "/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(28, "/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(28, "/init/init/running/custom_MM/wait_for_metamodel/got_result", self)
+        self.states["/init/init/running/custom_MM/wait_for_metamodel/got_result"] = State(29, "/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(29, "/init/init/running/custom_MM/wait_for_metamodel/mv_processing", self)
+        self.states["/init/init/running/custom_MM/wait_for_metamodel/mv_processing"] = State(30, "/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(30, "/init/init/running/change_mapper", self)
+        self.states["/init/init/running/change_mapper"] = State(31, "/init/init/running/change_mapper", self)
         
         # state /init/init/running/change_rendered
-        self.states["/init/init/running/change_rendered"] = State(31, "/init/init/running/change_rendered", self)
+        self.states["/init/init/running/change_rendered"] = State(32, "/init/init/running/change_rendered", self)
         
         # state /init/init/running/verify_model
-        self.states["/init/init/running/verify_model"] = State(32, "/init/init/running/verify_model", self)
+        self.states["/init/init/running/verify_model"] = State(33, "/init/init/running/verify_model", self)
         
         # state /init/init/running/verify_model/request
-        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"] = State(34, "/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(34, "/init/init/running/verify_model/show_result", self)
+        self.states["/init/init/running/verify_model/show_result"] = State(35, "/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(35, "/init/init/running/verify_model/wait_for_close", self)
+        self.states["/init/init/running/verify_model/wait_for_close"] = State(36, "/init/init/running/verify_model/wait_for_close", self)
         
         # state /init/init/running/open_model
-        self.states["/init/init/running/open_model"] = State(36, "/init/init/running/open_model", self)
+        self.states["/init/init/running/open_model"] = State(37, "/init/init/running/open_model", self)
         
         # state /init/init/running/open_model/query_model
-        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"] = State(38, "/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(38, "/init/init/running/open_model/wait_for_model", self)
+        self.states["/init/init/running/open_model/wait_for_model"] = State(39, "/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(39, "/init/init/running/open_model/got_model", self)
+        self.states["/init/init/running/open_model/got_model"] = State(40, "/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(40, "/init/init/running/open_model/search_metamodels", self)
+        self.states["/init/init/running/open_model/search_metamodels"] = State(41, "/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(41, "/init/init/running/open_model/search_CS_mappers", self)
+        self.states["/init/init/running/open_model/search_CS_mappers"] = State(42, "/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(42, "/init/init/running/open_model/check_CS_mapper", self)
+        self.states["/init/init/running/open_model/check_CS_mapper"] = State(43, "/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(43, "/init/init/running/open_model/search_CS_rendered", self)
+        self.states["/init/init/running/open_model/search_CS_rendered"] = State(44, "/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(44, "/init/init/running/open_model/store_metamodel", self)
+        self.states["/init/init/running/open_model/store_metamodel"] = State(45, "/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(45, "/init/init/running/new_rendered", self)
+        self.states["/init/init/running/new_rendered"] = State(46, "/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(46, "/init/init/running/create_new_model", self)
+        self.states["/init/init/running/create_new_model"] = State(47, "/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(47, "/init/init/running/create_new_model/query_metamodel", self)
+        self.states["/init/init/running/create_new_model/query_metamodel"] = State(48, "/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(48, "/init/init/running/create_new_model/wait_for_metamodel", self)
+        self.states["/init/init/running/create_new_model/wait_for_metamodel"] = State(49, "/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(49, "/init/init/running/create_new_model/got_mm", self)
+        self.states["/init/init/running/create_new_model/got_mm"] = State(50, "/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(50, "/init/init/running/create_new_model/prompt_model_name", self)
+        self.states["/init/init/running/create_new_model/prompt_model_name"] = State(51, "/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(51, "/init/init/running/create_new_model/waiting_for_model_name", self)
+        self.states["/init/init/running/create_new_model/waiting_for_model_name"] = State(52, "/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(52, "/init/init/running/create_new_model/creating_model", self)
+        self.states["/init/init/running/create_new_model/creating_model"] = State(53, "/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(53, "/init/init/running/rerender_model", self)
+        self.states["/init/init/running/rerender_model"] = State(54, "/init/init/running/rerender_model", self)
         
         # state /init/init/running/rerender_model/initial_render
-        self.states["/init/init/running/rerender_model/initial_render"] = State(54, "/init/init/running/rerender_model/initial_render", self)
+        self.states["/init/init/running/rerender_model/initial_render"] = State(55, "/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(55, "/init/init/running/rerender_model/recreate_toolbars", self)
+        self.states["/init/init/running/rerender_model/recreate_toolbars"] = State(56, "/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(56, "/init/init/running/rerender_model/recreate_toolbars/waiting", self)
+        self.states["/init/init/running/rerender_model/recreate_toolbars/waiting"] = State(57, "/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(57, "/init/init/running/rerender_model/recreate_toolbars/close_all", self)
+        self.states["/init/init/running/rerender_model/recreate_toolbars/close_all"] = State(58, "/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(58, "/init/init/running/rerender_model/canvas", self)
+        self.states["/init/init/running/rerender_model/canvas"] = State(59, "/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(59, "/init/init/running/rerender_model/pack_canvas", self)
+        self.states["/init/init/running/rerender_model/pack_canvas"] = State(60, "/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(60, "/init/init/running/rerender_model/model_toolbars", self)
+        self.states["/init/init/running/rerender_model/model_toolbars"] = State(61, "/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(61, "/init/init/running/rerender_model/model_toolbars/mm_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/mm_toolbar"] = State(62, "/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(62, "/init/init/running/rerender_model/model_toolbars/pack_mm_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/pack_mm_toolbar"] = State(63, "/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(63, "/init/init/running/rerender_model/model_toolbars/cs_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/cs_toolbar"] = State(64, "/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(64, "/init/init/running/rerender_model/model_toolbars/pack_cs_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/pack_cs_toolbar"] = State(65, "/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(65, "/init/init/running/rerender_model/model_toolbars/fetch_types", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/fetch_types"] = State(66, "/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(66, "/init/init/running/rerender_model/model_toolbars/dsl_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/dsl_toolbar"] = State(67, "/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(67, "/init/init/running/rerender_model/model_toolbars/pack_dsl_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/pack_dsl_toolbar"] = State(68, "/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(68, "/init/init/running/rerender_model/request_render", self)
+        self.states["/init/init/running/rerender_model/request_render"] = State(69, "/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(69, "/init/init/running/rerender_model/render_model", self)
+        self.states["/init/init/running/rerender_model/render_model"] = State(70, "/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(70, "/init/init/running/rerender_model/render_model/allocate_groups", self)
+        self.states["/init/init/running/rerender_model/render_model/allocate_groups"] = State(71, "/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(71, "/init/init/running/rerender_model/render_model/allocating_group", self)
+        self.states["/init/init/running/rerender_model/render_model/allocating_group"] = State(72, "/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(72, "/init/init/running/rerender_model/render_model/allocate_contains", self)
+        self.states["/init/init/running/rerender_model/render_model/allocate_contains"] = State(73, "/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(73, "/init/init/running/rerender_model/render_model/render_elements", self)
+        self.states["/init/init/running/rerender_model/render_model/render_elements"] = State(74, "/init/init/running/rerender_model/render_model/render_elements", self)
         
         # state /init/init/close
-        self.states["/init/init/close"] = State(74, "/init/init/close", self)
+        self.states["/init/init/close"] = State(75, "/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(75, "/init/key_status", self)
+        self.states["/init/key_status"] = State(76, "/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(76, "/init/key_status/listening", self)
+        self.states["/init/key_status/listening"] = State(77, "/init/key_status/listening", self)
         
         # add children
         self.states[""].addChild(self.states["/init"])
@@ -4959,6 +5059,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         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/modify_defined_attrs"].addChild(self.states["/init/init/running/modify_defined_attrs/mark_dirty"])
         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"])
@@ -5111,11 +5212,16 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         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 = Transition(self, self.states["/init/init/running/modify_defined_attrs/wait_for_finished"], [self.states["/init/init/running/modify_defined_attrs/mark_dirty"]])
         _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/modify_defined_attrs/mark_dirty
+        _init_init_running_modify_defined_attrs_mark_dirty_0 = Transition(self, self.states["/init/init/running/modify_defined_attrs/mark_dirty"], [self.states["/init/init/running/rerender_model"]])
+        _init_init_running_modify_defined_attrs_mark_dirty_0.setTrigger(Event("mv_response", None))
+        self.states["/init/init/running/modify_defined_attrs/mark_dirty"].addTransition(_init_init_running_modify_defined_attrs_mark_dirty_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"]])
         _init_init_running_add_object_diagrams_init_0.setAction(self._init_init_running_add_object_diagrams_init_0_exec)
@@ -5524,6 +5630,9 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def _init_init_running_modify_defined_attrs_create_window_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'subwindow', 'AttributeEditor', self.as_element]))
     
+    def _init_init_running_modify_defined_attrs_mark_dirty_enter(self):
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_rendered_model, self.cs_element, 'dirty', True]])]))
+    
     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...'])]))
@@ -5633,7 +5742,9 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     
     def _init_init_running_idle_9_exec(self, parameters):
         as_element = parameters[0]
+        cs_element = parameters[1]
         self.as_element = as_element
+        self.cs_element = cs_element
     
     def _init_init_running_idle_10_exec(self, parameters):
         new_metamodel = parameters[0]
@@ -9854,7 +9965,7 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
     
     def _main_3_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])]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/parent', Event("modify_defined_attrs", None, [self.as_element, self.cs_element])]))
     
     def _main_3_guard(self, parameters):
         ID = parameters[0]