Browse Source

Allow moving of elements, which updates the CS in the Mv

Yentl Van Tendeloo 8 years ago
parent
commit
bf2e017f12

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+*.pyc

BIN
classes/canvas/.canvas_element.xml.swp


+ 46 - 3
classes/canvas/canvas_element.xml

@@ -13,7 +13,8 @@
         <body>
         <body>
             self.containing_canvas = parent
             self.containing_canvas = parent
             self.coordinates = coordinates
             self.coordinates = coordinates
-            self.elements = []
+            self.elements = {}
+            self.tmp = {}
         </body>
         </body>
     </constructor>
     </constructor>
     <destructor>
     <destructor>
@@ -39,7 +40,7 @@
                         result = None
                         result = None
 
 
                     if result is not None:
                     if result is not None:
-                        self.elements.append(result)
+                        self.elements[result] = element["id"]
                         self.set_bindable_and_tagorid(self.containing_canvas, result)
                         self.set_bindable_and_tagorid(self.containing_canvas, result)
                 </script>
                 </script>
             </transition>
             </transition>
@@ -70,12 +71,54 @@
                 </script>
                 </script>
             </transition>
             </transition>
 
 
-            <transition event="left-release" cond="id(self) == ID" target="../main">
+            <transition event="left-release" cond="id(self) == ID" target="../update_mv">
                 <parameter name="ID"/>
                 <parameter name="ID"/>
                 <script>
                 <script>
                     self.coordinates = self.coordinates[0] - (self.original_coords[0] - self.last_x), self.coordinates[1] - (self.original_coords[1] - self.last_y)
                     self.coordinates = self.coordinates[0] - (self.original_coords[0] - self.last_x), self.coordinates[1] - (self.original_coords[1] - self.last_y)
+                    self.to_update = dict(self.elements)
                 </script>
                 </script>
             </transition>
             </transition>
         </state>
         </state>
+
+        <state id="update_mv" initial="init">
+            <state id="init">
+                <transition cond="len(self.to_update) > 0" target="../x">
+                    <script>
+                        tk_id, self.tmp["mv_id"] = self.to_update.popitem()
+                        self.tmp['x'], self.tmp['y'] = self.containing_canvas.coords(tk_id)[:2]
+                    </script>
+                </transition>
+
+                <transition cond="len(self.to_update) == 0" target="../../main"/>
+            </state>
+
+            <state id="x">
+                <onentry>
+                    <raise event="mv_request" scope="broad">
+                        <parameter expr="'attr_assign'"/>
+                        <parameter expr="[current_rendered_model, self.tmp['mv_id'], 'x', self.tmp['x']]"/>
+                    </raise>
+                    <script>
+                        print("Update X")
+                    </script>
+                </onentry>
+
+                <transition event="mv_response" target="../y"/>
+            </state>
+
+            <state id="y">
+                <onentry>
+                    <raise event="mv_request" scope="broad">
+                        <parameter expr="'attr_assign'"/>
+                        <parameter expr="[current_rendered_model, self.tmp['mv_id'], 'y', self.tmp['y']]"/>
+                    </raise>
+                    <script>
+                        print("Update Y")
+                    </script>
+                </onentry>
+
+                <transition event="mv_response" target="../init"/>
+            </state>
+        </state>
     </scxml>
     </scxml>
 </class>
 </class>

+ 3 - 0
classes/main_app.xml

@@ -291,6 +291,9 @@
                     <transition event="mv_request" target=".">
                     <transition event="mv_request" target=".">
                         <parameter name="name"/>
                         <parameter name="name"/>
                         <parameter name="params"/>
                         <parameter name="params"/>
+                        <script>
+                            print("MV OPERATION " + str(name))
+                        </script>
                         <raise event="action" scope="narrow" target="'modelverse'">
                         <raise event="action" scope="narrow" target="'modelverse'">
                             <parameter expr="name"/>
                             <parameter expr="name"/>
                             <parameter expr="None"/>
                             <parameter expr="None"/>

+ 4 - 8
classes/modelverse/modelverse.xml

@@ -283,18 +283,12 @@
 
 
                     <state id="model_list">
                     <state id="model_list">
                         <onentry>
                         <onentry>
-                            <script>
-                                print("DOING model_list")
-                            </script>
                             <raise event="request">
                             <raise event="request">
                                 <parameter expr="['model_list', self.parameters[0]]"/>
                                 <parameter expr="['model_list', self.parameters[0]]"/>
                             </raise>
                             </raise>
                         </onentry>
                         </onentry>
 
 
                         <transition cond="self.expect_response_partial('Success: ', pop=False)" target="../../wait_for_action/history">
                         <transition cond="self.expect_response_partial('Success: ', pop=False)" target="../../wait_for_action/history">
-                            <script>
-                                print("Got response to model_list")
-                            </script>
                             <raise event="result">
                             <raise event="result">
                                 <parameter expr="set(self.split_response(self.responses.pop(0)))"/>
                                 <parameter expr="set(self.split_response(self.responses.pop(0)))"/>
                             </raise>
                             </raise>
@@ -1583,7 +1577,8 @@
                             </script>
                             </script>
                         </transition>
                         </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', '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>
                     </state>
 
 
                     <state id="modelling">
                     <state id="modelling">
@@ -1759,7 +1754,8 @@
                         </raise>
                         </raise>
                     </onentry>
                     </onentry>
 
 
-                    <transition cond="self.expect_response('Model loaded, ready for commands!', pop=True)" target="../wait_for_action/modelling/recognized/manual"/>
+                    <transition cond="self.expect_response('Model loaded, ready for commands!', pop=True)" target="../wait_for_action/modelling/recognized/manual">
+                    </transition>
 
 
                     <transition cond="self.expect_response_partial('No conformance relation can be found ', pop=False)" target="../wait_for_action/megamodelling">
                     <transition cond="self.expect_response_partial('No conformance relation can be found ', pop=False)" target="../wait_for_action/megamodelling">
                         <raise event="exception">
                         <raise event="exception">

+ 46 - 19
classes/window/main_window.xml

@@ -13,8 +13,6 @@
         <super class="tk.TopLevel"/>
         <super class="tk.TopLevel"/>
         <super class="SCCDWidget"/>
         <super class="SCCDWidget"/>
         <body>
         <body>
-            self.current_model = None
-            self.metamodel = None
             self.toolbar_frame = tk.Frame(self)
             self.toolbar_frame = tk.Frame(self)
             self.canvas_frame = tk.Frame(self)
             self.canvas_frame = tk.Frame(self)
             self.progressbar_frame = tk.Frame(self)
             self.progressbar_frame = tk.Frame(self)
@@ -164,7 +162,8 @@
                     <transition event="browse_result" target="../got_model">
                     <transition event="browse_result" target="../got_model">
                         <parameter name="result"/>
                         <parameter name="result"/>
                         <script>
                         <script>
-                            self.current_model = result
+                            global current_model
+                            current_model = result
                         </script>
                         </script>
                     </transition>
                     </transition>
                 </state>
                 </state>
@@ -181,7 +180,7 @@
                     <onentry>
                     <onentry>
                         <raise event="mv_request" scope="broad">
                         <raise event="mv_request" scope="broad">
                             <parameter expr="'model_types'"/>
                             <parameter expr="'model_types'"/>
-                            <parameter expr="[self.current_model]"/>
+                            <parameter expr="[current_model]"/>
                         </raise>
                         </raise>
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
                             <parameter expr="10"/>
                             <parameter expr="10"/>
@@ -193,10 +192,11 @@
                         <parameter name="result"/>
                         <parameter name="result"/>
                         <script>
                         <script>
                             print("Allowable types for this model: " + str(result))
                             print("Allowable types for this model: " + str(result))
+                            global current_metamodel
                             if len(result) > 0:
                             if len(result) > 0:
-                                self.metamodel = next(iter(result))
+                                current_metamodel = next(iter(result))
                             else:
                             else:
-                                self.metamodel = ''
+                                current_metamodel = ''
                         </script>
                         </script>
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
                             <parameter expr="20"/>
                             <parameter expr="20"/>
@@ -210,7 +210,7 @@
                         <raise event="create_instance" scope="cd">
                         <raise event="create_instance" scope="cd">
                             <parameter expr="'subwindow'"/>
                             <parameter expr="'subwindow'"/>
                             <parameter expr="'PromptWindow'"/>
                             <parameter expr="'PromptWindow'"/>
-                            <parameter expr="{'Metamodel name': self.metamodel}"/>
+                            <parameter expr="{'Metamodel name': current_metamodel}"/>
                             <parameter expr="{}"/>
                             <parameter expr="{}"/>
                         </raise>
                         </raise>
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
@@ -234,11 +234,12 @@
                     <transition event="prompt_results" target=".">
                     <transition event="prompt_results" target=".">
                         <parameter name="results"/>
                         <parameter name="results"/>
                         <script>
                         <script>
-                            self.metamodel = results["Metamodel name"]
+                            global current_metamodel
+                            current_metamodel = results["Metamodel name"]
                         </script>
                         </script>
                     </transition>
                     </transition>
 
 
-                    <transition event="close_window" cond="self.metamodel != ''" target="../../rerender_model">
+                    <transition event="close_window" cond="current_metamodel != ''" target="../store_metamodel">
                         <raise event="delete_instance" scope="cd">
                         <raise event="delete_instance" scope="cd">
                             <parameter expr="self.subwindow"/>
                             <parameter expr="self.subwindow"/>
                         </raise>
                         </raise>
@@ -248,16 +249,33 @@
                         </raise>
                         </raise>
                     </transition>
                     </transition>
 
 
-                    <transition event="close_window" cond="self.metamodel == ''" target="../../idle">
+                    <transition event="close_window" cond="current_metamodel == ''" target="../../idle">
                         <raise event="delete_instance" scope="cd">
                         <raise event="delete_instance" scope="cd">
                             <parameter expr="self.subwindow"/>
                             <parameter expr="self.subwindow"/>
                         </raise>
                         </raise>
                         <script>
                         <script>
-                            self.current_model = None
-                            self.metamodel = None
+                            global current_model
+                            global current_metamodel
+                            current_model = None
+                            current_metamodel = None
                         </script>
                         </script>
                     </transition>
                     </transition>
                 </state>
                 </state>
+
+                <state id="store_metamodel">
+                    <onentry>
+                        <raise event="mv_request" scope="broad">
+                            <parameter expr="'alter_context'"/>
+                            <parameter expr="[current_model, current_metamodel]"/>
+                        </raise>
+                        <raise event="update_status" scope="narrow" target="'progress_bar'">
+                            <parameter expr="45"/>
+                            <parameter expr="'Storing model context...'"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="mv_response" target="../../rerender_model"/>
+                </state>
             </state>
             </state>
 
 
             <state id="create_new_model" initial="query_metamodel">
             <state id="create_new_model" initial="query_metamodel">
@@ -296,7 +314,8 @@
                     <transition event="browse_result" target="../got_mm">
                     <transition event="browse_result" target="../got_mm">
                         <parameter name="result"/>
                         <parameter name="result"/>
                         <script>
                         <script>
-                            self.metamodel = result
+                            global current_metamodel
+                            current_metamodel = result
                         </script>
                         </script>
                     </transition>
                     </transition>
                 </state>
                 </state>
@@ -334,7 +353,7 @@
                         </raise>
                         </raise>
                         <script>
                         <script>
                             self.subwindow = association_name
                             self.subwindow = association_name
-                            self.current_model = ""
+                            current_model = ""
                         </script>
                         </script>
                     </transition>
                     </transition>
                 </state>
                 </state>
@@ -343,11 +362,11 @@
                     <transition event="prompt_results" target=".">
                     <transition event="prompt_results" target=".">
                         <parameter name="results"/>
                         <parameter name="results"/>
                         <script>
                         <script>
-                            self.current_model = results["Model name"]
+                            current_model = results["Model name"]
                         </script>
                         </script>
                     </transition>
                     </transition>
 
 
-                    <transition event="close_window" cond="self.current_model != ''" target="../creating_model">
+                    <transition event="close_window" cond="current_model != ''" target="../creating_model">
                         <raise event="delete_instance" scope="cd">
                         <raise event="delete_instance" scope="cd">
                             <parameter expr="self.subwindow"/>
                             <parameter expr="self.subwindow"/>
                         </raise>
                         </raise>
@@ -357,7 +376,7 @@
                         </raise>
                         </raise>
                     </transition>
                     </transition>
 
 
-                    <transition event="close_window" cond="self.current_model == ''" target="../../idle">
+                    <transition event="close_window" cond="current_model == ''" target="../../idle">
                         <raise event="delete_instance" scope="cd">
                         <raise event="delete_instance" scope="cd">
                             <parameter expr="self.subwindow"/>
                             <parameter expr="self.subwindow"/>
                         </raise>
                         </raise>
@@ -368,7 +387,7 @@
                     <onentry>
                     <onentry>
                         <raise event="mv_request" scope="broad">
                         <raise event="mv_request" scope="broad">
                             <parameter expr="'model_add'"/>
                             <parameter expr="'model_add'"/>
-                            <parameter expr="[self.current_model, self.metamodel, '']"/>
+                            <parameter expr="[current_model, current_metamodel, '']"/>
                         </raise>
                         </raise>
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
                             <parameter expr="25"/>
                             <parameter expr="25"/>
@@ -390,8 +409,12 @@
                     <onentry>
                     <onentry>
                         <raise event="mv_request" scope="broad">
                         <raise event="mv_request" scope="broad">
                             <parameter expr="'model_render'"/>
                             <parameter expr="'model_render'"/>
-                            <parameter expr="[self.current_model, 'models/render_SCD']"/>
+                            <parameter expr="[current_model, 'models/render_SCD']"/>
                         </raise>
                         </raise>
+                        <script>
+                            global current_rendered_model
+                            current_rendered_model = "rendered/%s%s" % (current_model, 'models/render_SCD')
+                        </script>
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
                             <parameter expr="50"/>
                             <parameter expr="50"/>
                             <parameter expr="'Perceptualizing model...'"/>
                             <parameter expr="'Perceptualizing model...'"/>
@@ -421,6 +444,10 @@
                             self.rendered = [i for i in self.rendered if i["type"] not in ["Group", "contains"]]
                             self.rendered = [i for i in self.rendered if i["type"] not in ["Group", "contains"]]
                             self.rendered.reverse()
                             self.rendered.reverse()
                         </script>
                         </script>
+                        <raise event="mv_request" scope="broad">
+                            <parameter expr="'alter_context'"/>
+                            <parameter expr="['rendered/%s%s' % (current_model, 'models/render_SCD'), 'formalisms/MM_render']"/>
+                        </raise>
                     </onentry>
                     </onentry>
 
 
                     <state id="allocate_groups">
                     <state id="allocate_groups">

+ 124 - 45
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)
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
 
-Date:   Wed Sep 13 14:34:26 2017
+Date:   Wed Sep 13 15:54:04 2017
 
 
 Model author: Yentl Van Tendeloo and Addis Gebremichael
 Model author: Yentl Van Tendeloo and Addis Gebremichael
 Model name:   Modelverse Visual Editor - Tkinter Version 
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -17,6 +17,9 @@ import uuid
 import json
 import json
 import urllib
 import urllib
 
 
+global current_model
+global current_metamodel
+
 # package "Modelverse Visual Editor - Tkinter Version "
 # package "Modelverse Visual Editor - Tkinter Version "
 
 
 class MainApp(RuntimeClassBase):
 class MainApp(RuntimeClassBase):
@@ -397,6 +400,7 @@ class MainApp(RuntimeClassBase):
     def _parallel_forward_requests_forward_1_exec(self, parameters):
     def _parallel_forward_requests_forward_1_exec(self, parameters):
         name = parameters[0]
         name = parameters[0]
         params = parameters[1]
         params = parameters[1]
+        print("MV OPERATION " + str(name))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'modelverse', Event("action", None, [name, None, None, params])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'modelverse', Event("action", None, [name, None, None, params])]))
     
     
     def _parallel_forward_requests_forward_2_exec(self, parameters):
     def _parallel_forward_requests_forward_2_exec(self, parameters):
@@ -2143,7 +2147,6 @@ class Modelverse(RuntimeClassBase):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'http_client', 'HTTPClient']))
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'http_client', 'HTTPClient']))
     
     
     def _initialized_behaviour_operations_model_list_enter(self):
     def _initialized_behaviour_operations_model_list_enter(self):
-        print("DOING model_list")
         self.raiseInternalEvent(Event("request", None, [['model_list', self.parameters[0]]]))
         self.raiseInternalEvent(Event("request", None, [['model_list', self.parameters[0]]]))
     
     
     def _initialized_behaviour_operations_model_add_send_metadata_enter(self):
     def _initialized_behaviour_operations_model_add_send_metadata_enter(self):
@@ -2592,7 +2595,6 @@ class Modelverse(RuntimeClassBase):
         return self.expect_response('Use the \'help\' command for a list of possible commands', pop=True)
         return self.expect_response('Use the \'help\' command for a list of possible commands', pop=True)
     
     
     def _initialized_behaviour_operations_model_list_0_exec(self, parameters):
     def _initialized_behaviour_operations_model_list_0_exec(self, parameters):
-        print("Got response to model_list")
         self.raiseInternalEvent(Event("result", None, [set(self.split_response(self.responses.pop(0)))]))
         self.raiseInternalEvent(Event("result", None, [set(self.split_response(self.responses.pop(0)))]))
     
     
     def _initialized_behaviour_operations_model_list_0_guard(self, parameters):
     def _initialized_behaviour_operations_model_list_0_guard(self, parameters):
@@ -3844,8 +3846,6 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def user_defined_constructor(self):
     def user_defined_constructor(self):
         tk.Toplevel.__init__(self)
         tk.Toplevel.__init__(self)
         SCCDWidget.__init__(self)
         SCCDWidget.__init__(self)
-        self.current_model = None
-        self.metamodel = None
         self.toolbar_frame = tk.Frame(self)
         self.toolbar_frame = tk.Frame(self)
         self.canvas_frame = tk.Frame(self)
         self.canvas_frame = tk.Frame(self)
         self.progressbar_frame = tk.Frame(self)
         self.progressbar_frame = tk.Frame(self)
@@ -3923,55 +3923,59 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         # state /running/open_model/waiting_for_metamodel_name
         # state /running/open_model/waiting_for_metamodel_name
         self.states["/running/open_model/waiting_for_metamodel_name"] = State(16, "/running/open_model/waiting_for_metamodel_name", self)
         self.states["/running/open_model/waiting_for_metamodel_name"] = State(16, "/running/open_model/waiting_for_metamodel_name", self)
         
         
+        # state /running/open_model/store_metamodel
+        self.states["/running/open_model/store_metamodel"] = State(17, "/running/open_model/store_metamodel", self)
+        self.states["/running/open_model/store_metamodel"].setEnter(self._running_open_model_store_metamodel_enter)
+        
         # state /running/create_new_model
         # state /running/create_new_model
-        self.states["/running/create_new_model"] = State(17, "/running/create_new_model", self)
+        self.states["/running/create_new_model"] = State(18, "/running/create_new_model", self)
         
         
         # state /running/create_new_model/query_metamodel
         # state /running/create_new_model/query_metamodel
-        self.states["/running/create_new_model/query_metamodel"] = State(18, "/running/create_new_model/query_metamodel", self)
+        self.states["/running/create_new_model/query_metamodel"] = State(19, "/running/create_new_model/query_metamodel", self)
         self.states["/running/create_new_model/query_metamodel"].setEnter(self._running_create_new_model_query_metamodel_enter)
         self.states["/running/create_new_model/query_metamodel"].setEnter(self._running_create_new_model_query_metamodel_enter)
         
         
         # state /running/create_new_model/wait_for_metamodel
         # state /running/create_new_model/wait_for_metamodel
-        self.states["/running/create_new_model/wait_for_metamodel"] = State(19, "/running/create_new_model/wait_for_metamodel", self)
+        self.states["/running/create_new_model/wait_for_metamodel"] = State(20, "/running/create_new_model/wait_for_metamodel", self)
         
         
         # state /running/create_new_model/got_mm
         # state /running/create_new_model/got_mm
-        self.states["/running/create_new_model/got_mm"] = State(20, "/running/create_new_model/got_mm", self)
+        self.states["/running/create_new_model/got_mm"] = State(21, "/running/create_new_model/got_mm", self)
         
         
         # state /running/create_new_model/prompt_model_name
         # state /running/create_new_model/prompt_model_name
-        self.states["/running/create_new_model/prompt_model_name"] = State(21, "/running/create_new_model/prompt_model_name", self)
+        self.states["/running/create_new_model/prompt_model_name"] = State(22, "/running/create_new_model/prompt_model_name", self)
         self.states["/running/create_new_model/prompt_model_name"].setEnter(self._running_create_new_model_prompt_model_name_enter)
         self.states["/running/create_new_model/prompt_model_name"].setEnter(self._running_create_new_model_prompt_model_name_enter)
         
         
         # state /running/create_new_model/waiting_for_model_name
         # state /running/create_new_model/waiting_for_model_name
-        self.states["/running/create_new_model/waiting_for_model_name"] = State(22, "/running/create_new_model/waiting_for_model_name", self)
+        self.states["/running/create_new_model/waiting_for_model_name"] = State(23, "/running/create_new_model/waiting_for_model_name", self)
         
         
         # state /running/create_new_model/creating_model
         # state /running/create_new_model/creating_model
-        self.states["/running/create_new_model/creating_model"] = State(23, "/running/create_new_model/creating_model", self)
+        self.states["/running/create_new_model/creating_model"] = State(24, "/running/create_new_model/creating_model", self)
         self.states["/running/create_new_model/creating_model"].setEnter(self._running_create_new_model_creating_model_enter)
         self.states["/running/create_new_model/creating_model"].setEnter(self._running_create_new_model_creating_model_enter)
         
         
         # state /running/rerender_model
         # state /running/rerender_model
-        self.states["/running/rerender_model"] = State(24, "/running/rerender_model", self)
+        self.states["/running/rerender_model"] = State(25, "/running/rerender_model", self)
         
         
         # state /running/rerender_model/request_render
         # state /running/rerender_model/request_render
-        self.states["/running/rerender_model/request_render"] = State(25, "/running/rerender_model/request_render", self)
+        self.states["/running/rerender_model/request_render"] = State(26, "/running/rerender_model/request_render", self)
         self.states["/running/rerender_model/request_render"].setEnter(self._running_rerender_model_request_render_enter)
         self.states["/running/rerender_model/request_render"].setEnter(self._running_rerender_model_request_render_enter)
         
         
         # state /running/rerender_model/render_model
         # state /running/rerender_model/render_model
-        self.states["/running/rerender_model/render_model"] = State(26, "/running/rerender_model/render_model", self)
+        self.states["/running/rerender_model/render_model"] = State(27, "/running/rerender_model/render_model", self)
         self.states["/running/rerender_model/render_model"].setEnter(self._running_rerender_model_render_model_enter)
         self.states["/running/rerender_model/render_model"].setEnter(self._running_rerender_model_render_model_enter)
         
         
         # state /running/rerender_model/render_model/allocate_groups
         # state /running/rerender_model/render_model/allocate_groups
-        self.states["/running/rerender_model/render_model/allocate_groups"] = State(27, "/running/rerender_model/render_model/allocate_groups", self)
+        self.states["/running/rerender_model/render_model/allocate_groups"] = State(28, "/running/rerender_model/render_model/allocate_groups", self)
         
         
         # state /running/rerender_model/render_model/allocating_group
         # state /running/rerender_model/render_model/allocating_group
-        self.states["/running/rerender_model/render_model/allocating_group"] = State(28, "/running/rerender_model/render_model/allocating_group", self)
+        self.states["/running/rerender_model/render_model/allocating_group"] = State(29, "/running/rerender_model/render_model/allocating_group", self)
         
         
         # state /running/rerender_model/render_model/allocate_contains
         # state /running/rerender_model/render_model/allocate_contains
-        self.states["/running/rerender_model/render_model/allocate_contains"] = State(29, "/running/rerender_model/render_model/allocate_contains", self)
+        self.states["/running/rerender_model/render_model/allocate_contains"] = State(30, "/running/rerender_model/render_model/allocate_contains", self)
         
         
         # state /running/rerender_model/render_model/render_elements
         # state /running/rerender_model/render_model/render_elements
-        self.states["/running/rerender_model/render_model/render_elements"] = State(30, "/running/rerender_model/render_model/render_elements", self)
+        self.states["/running/rerender_model/render_model/render_elements"] = State(31, "/running/rerender_model/render_model/render_elements", self)
         
         
         # state /close
         # state /close
-        self.states["/close"] = State(31, "/close", self)
+        self.states["/close"] = State(32, "/close", self)
         self.states["/close"].setEnter(self._close_enter)
         self.states["/close"].setEnter(self._close_enter)
         
         
         # add children
         # add children
@@ -3994,6 +3998,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/running/open_model"].addChild(self.states["/running/open_model/search_metamodels"])
         self.states["/running/open_model"].addChild(self.states["/running/open_model/search_metamodels"])
         self.states["/running/open_model"].addChild(self.states["/running/open_model/prompt_metamodel"])
         self.states["/running/open_model"].addChild(self.states["/running/open_model/prompt_metamodel"])
         self.states["/running/open_model"].addChild(self.states["/running/open_model/waiting_for_metamodel_name"])
         self.states["/running/open_model"].addChild(self.states["/running/open_model/waiting_for_metamodel_name"])
+        self.states["/running/open_model"].addChild(self.states["/running/open_model/store_metamodel"])
         self.states["/running/create_new_model"].addChild(self.states["/running/create_new_model/query_metamodel"])
         self.states["/running/create_new_model"].addChild(self.states["/running/create_new_model/query_metamodel"])
         self.states["/running/create_new_model"].addChild(self.states["/running/create_new_model/wait_for_metamodel"])
         self.states["/running/create_new_model"].addChild(self.states["/running/create_new_model/wait_for_metamodel"])
         self.states["/running/create_new_model"].addChild(self.states["/running/create_new_model/got_mm"])
         self.states["/running/create_new_model"].addChild(self.states["/running/create_new_model/got_mm"])
@@ -4098,7 +4103,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         _running_open_model_waiting_for_metamodel_name_0.setAction(self._running_open_model_waiting_for_metamodel_name_0_exec)
         _running_open_model_waiting_for_metamodel_name_0.setAction(self._running_open_model_waiting_for_metamodel_name_0_exec)
         _running_open_model_waiting_for_metamodel_name_0.setTrigger(Event("prompt_results", None))
         _running_open_model_waiting_for_metamodel_name_0.setTrigger(Event("prompt_results", None))
         self.states["/running/open_model/waiting_for_metamodel_name"].addTransition(_running_open_model_waiting_for_metamodel_name_0)
         self.states["/running/open_model/waiting_for_metamodel_name"].addTransition(_running_open_model_waiting_for_metamodel_name_0)
-        _running_open_model_waiting_for_metamodel_name_1 = Transition(self, self.states["/running/open_model/waiting_for_metamodel_name"], [self.states["/running/rerender_model"]])
+        _running_open_model_waiting_for_metamodel_name_1 = Transition(self, self.states["/running/open_model/waiting_for_metamodel_name"], [self.states["/running/open_model/store_metamodel"]])
         _running_open_model_waiting_for_metamodel_name_1.setAction(self._running_open_model_waiting_for_metamodel_name_1_exec)
         _running_open_model_waiting_for_metamodel_name_1.setAction(self._running_open_model_waiting_for_metamodel_name_1_exec)
         _running_open_model_waiting_for_metamodel_name_1.setTrigger(Event("close_window", None))
         _running_open_model_waiting_for_metamodel_name_1.setTrigger(Event("close_window", None))
         _running_open_model_waiting_for_metamodel_name_1.setGuard(self._running_open_model_waiting_for_metamodel_name_1_guard)
         _running_open_model_waiting_for_metamodel_name_1.setGuard(self._running_open_model_waiting_for_metamodel_name_1_guard)
@@ -4109,6 +4114,11 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         _running_open_model_waiting_for_metamodel_name_2.setGuard(self._running_open_model_waiting_for_metamodel_name_2_guard)
         _running_open_model_waiting_for_metamodel_name_2.setGuard(self._running_open_model_waiting_for_metamodel_name_2_guard)
         self.states["/running/open_model/waiting_for_metamodel_name"].addTransition(_running_open_model_waiting_for_metamodel_name_2)
         self.states["/running/open_model/waiting_for_metamodel_name"].addTransition(_running_open_model_waiting_for_metamodel_name_2)
         
         
+        # transition /running/open_model/store_metamodel
+        _running_open_model_store_metamodel_0 = Transition(self, self.states["/running/open_model/store_metamodel"], [self.states["/running/rerender_model"]])
+        _running_open_model_store_metamodel_0.setTrigger(Event("mv_response", None))
+        self.states["/running/open_model/store_metamodel"].addTransition(_running_open_model_store_metamodel_0)
+        
         # transition /running/create_new_model/query_metamodel
         # transition /running/create_new_model/query_metamodel
         _running_create_new_model_query_metamodel_0 = Transition(self, self.states["/running/create_new_model/query_metamodel"], [self.states["/running/create_new_model/wait_for_metamodel"]])
         _running_create_new_model_query_metamodel_0 = Transition(self, self.states["/running/create_new_model/query_metamodel"], [self.states["/running/create_new_model/wait_for_metamodel"]])
         _running_create_new_model_query_metamodel_0.setAction(self._running_create_new_model_query_metamodel_0_exec)
         _running_create_new_model_query_metamodel_0.setAction(self._running_create_new_model_query_metamodel_0_exec)
@@ -4219,6 +4229,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.contains = [i for i in self.rendered if i["type"] == "contains"]
         self.contains = [i for i in self.rendered if i["type"] == "contains"]
         self.rendered = [i for i in self.rendered if i["type"] not in ["Group", "contains"]]
         self.rendered = [i for i in self.rendered if i["type"] not in ["Group", "contains"]]
         self.rendered.reverse()
         self.rendered.reverse()
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['alter_context', ['rendered/%s%s' % (current_model, 'models/render_SCD'), 'formalisms/MM_render']])]))
     
     
     def _init_generic_toolbar_enter(self):
     def _init_generic_toolbar_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'toolbars', 'GenericToolbar', self.toolbar_frame]))
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'toolbars', 'GenericToolbar', self.toolbar_frame]))
@@ -4237,13 +4248,17 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [0, 'Browsing for model...'])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [0, 'Browsing for model...'])]))
     
     
     def _running_open_model_search_metamodels_enter(self):
     def _running_open_model_search_metamodels_enter(self):
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['model_types', [self.current_model]])]))
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['model_types', [current_model]])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [10, 'Querying existing metamodels...'])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [10, 'Querying existing metamodels...'])]))
     
     
     def _running_open_model_prompt_metamodel_enter(self):
     def _running_open_model_prompt_metamodel_enter(self):
-        self.big_step.outputEventOM(Event("create_instance", None, [self, 'subwindow', 'PromptWindow', {'Metamodel name': self.metamodel}, {}]))
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'subwindow', 'PromptWindow', {'Metamodel name': current_metamodel}, {}]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [30, 'Requesting desired metamodel...'])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [30, 'Requesting desired metamodel...'])]))
     
     
+    def _running_open_model_store_metamodel_enter(self):
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['alter_context', [current_model, current_metamodel]])]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [45, 'Storing model context...'])]))
+    
     def _running_create_new_model_query_metamodel_enter(self):
     def _running_create_new_model_query_metamodel_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'subwindow', 'Browser', 'Select metamodel to instantiate', ['formalisms/SimpleClassDiagrams']]))
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'subwindow', 'Browser', 'Select metamodel to instantiate', ['formalisms/SimpleClassDiagrams']]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [0, 'Browsing for metamodel...'])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [0, 'Browsing for metamodel...'])]))
@@ -4253,11 +4268,13 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [10, 'Prompt model name...'])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [10, 'Prompt model name...'])]))
     
     
     def _running_create_new_model_creating_model_enter(self):
     def _running_create_new_model_creating_model_enter(self):
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['model_add', [self.current_model, self.metamodel, '']])]))
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['model_add', [current_model, current_metamodel, '']])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [25, 'Creating empty model...'])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [25, 'Creating empty model...'])]))
     
     
     def _running_rerender_model_request_render_enter(self):
     def _running_rerender_model_request_render_enter(self):
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['model_render', [self.current_model, 'models/render_SCD']])]))
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['model_render', [current_model, 'models/render_SCD']])]))
+        global current_rendered_model
+        current_rendered_model = "rendered/%s%s" % (current_model, 'models/render_SCD')
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [50, 'Perceptualizing model...'])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [50, 'Perceptualizing model...'])]))
     
     
     def _close_enter(self):
     def _close_enter(self):
@@ -4302,7 +4319,8 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     
     
     def _running_open_model_wait_for_model_1_exec(self, parameters):
     def _running_open_model_wait_for_model_1_exec(self, parameters):
         result = parameters[0]
         result = parameters[0]
-        self.current_model = result
+        global current_model
+        current_model = result
     
     
     def _running_open_model_got_model_0_exec(self, parameters):
     def _running_open_model_got_model_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
@@ -4310,10 +4328,11 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def _running_open_model_search_metamodels_0_exec(self, parameters):
     def _running_open_model_search_metamodels_0_exec(self, parameters):
         result = parameters[0]
         result = parameters[0]
         print("Allowable types for this model: " + str(result))
         print("Allowable types for this model: " + str(result))
+        global current_metamodel
         if len(result) > 0:
         if len(result) > 0:
-            self.metamodel = next(iter(result))
+            current_metamodel = next(iter(result))
         else:
         else:
-            self.metamodel = ''
+            current_metamodel = ''
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [20, 'Querying existing metamodels... OK'])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [20, 'Querying existing metamodels... OK'])]))
     
     
     def _running_open_model_prompt_metamodel_0_exec(self, parameters):
     def _running_open_model_prompt_metamodel_0_exec(self, parameters):
@@ -4323,22 +4342,25 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     
     
     def _running_open_model_waiting_for_metamodel_name_0_exec(self, parameters):
     def _running_open_model_waiting_for_metamodel_name_0_exec(self, parameters):
         results = parameters[0]
         results = parameters[0]
-        self.metamodel = results["Metamodel name"]
+        global current_metamodel
+        current_metamodel = results["Metamodel name"]
     
     
     def _running_open_model_waiting_for_metamodel_name_1_exec(self, parameters):
     def _running_open_model_waiting_for_metamodel_name_1_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [40, 'Requesting desired metamodel... OK'])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [40, 'Requesting desired metamodel... OK'])]))
     
     
     def _running_open_model_waiting_for_metamodel_name_1_guard(self, parameters):
     def _running_open_model_waiting_for_metamodel_name_1_guard(self, parameters):
-        return self.metamodel != ''
+        return current_metamodel != ''
     
     
     def _running_open_model_waiting_for_metamodel_name_2_exec(self, parameters):
     def _running_open_model_waiting_for_metamodel_name_2_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
-        self.current_model = None
-        self.metamodel = None
+        global current_model
+        global current_metamodel
+        current_model = None
+        current_metamodel = None
     
     
     def _running_open_model_waiting_for_metamodel_name_2_guard(self, parameters):
     def _running_open_model_waiting_for_metamodel_name_2_guard(self, parameters):
-        return self.metamodel == ''
+        return current_metamodel == ''
     
     
     def _running_create_new_model_query_metamodel_0_exec(self, parameters):
     def _running_create_new_model_query_metamodel_0_exec(self, parameters):
         association_name = parameters[0]
         association_name = parameters[0]
@@ -4350,7 +4372,8 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     
     
     def _running_create_new_model_wait_for_metamodel_1_exec(self, parameters):
     def _running_create_new_model_wait_for_metamodel_1_exec(self, parameters):
         result = parameters[0]
         result = parameters[0]
-        self.metamodel = result
+        global current_metamodel
+        current_metamodel = result
     
     
     def _running_create_new_model_got_mm_0_exec(self, parameters):
     def _running_create_new_model_got_mm_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
@@ -4360,24 +4383,24 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         association_name = parameters[0]
         association_name = parameters[0]
         self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
         self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
         self.subwindow = association_name
         self.subwindow = association_name
-        self.current_model = ""
+        current_model = ""
     
     
     def _running_create_new_model_waiting_for_model_name_0_exec(self, parameters):
     def _running_create_new_model_waiting_for_model_name_0_exec(self, parameters):
         results = parameters[0]
         results = parameters[0]
-        self.current_model = results["Model name"]
+        current_model = results["Model name"]
     
     
     def _running_create_new_model_waiting_for_model_name_1_exec(self, parameters):
     def _running_create_new_model_waiting_for_model_name_1_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [20, 'Prompt model name... OK'])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [20, 'Prompt model name... OK'])]))
     
     
     def _running_create_new_model_waiting_for_model_name_1_guard(self, parameters):
     def _running_create_new_model_waiting_for_model_name_1_guard(self, parameters):
-        return self.current_model != ''
+        return current_model != ''
     
     
     def _running_create_new_model_waiting_for_model_name_2_exec(self, parameters):
     def _running_create_new_model_waiting_for_model_name_2_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
     
     
     def _running_create_new_model_waiting_for_model_name_2_guard(self, parameters):
     def _running_create_new_model_waiting_for_model_name_2_guard(self, parameters):
-        return self.current_model == ''
+        return current_model == ''
     
     
     def _running_create_new_model_creating_model_0_exec(self, parameters):
     def _running_create_new_model_creating_model_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [40, 'Creating empty model... OK'])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [40, 'Creating empty model... OK'])]))
@@ -5676,7 +5699,8 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
         SCCDWidget.__init__(self, True)
         SCCDWidget.__init__(self, True)
         self.containing_canvas = parent
         self.containing_canvas = parent
         self.coordinates = coordinates
         self.coordinates = coordinates
-        self.elements = []
+        self.elements = {}
+        self.tmp = {}
     
     
     def user_defined_destructor(self):
     def user_defined_destructor(self):
         # call super class destructors
         # call super class destructors
@@ -5696,11 +5720,30 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
         # state /dragging
         # state /dragging
         self.states["/dragging"] = State(2, "/dragging", self)
         self.states["/dragging"] = State(2, "/dragging", self)
         
         
+        # state /update_mv
+        self.states["/update_mv"] = State(3, "/update_mv", self)
+        
+        # state /update_mv/init
+        self.states["/update_mv/init"] = State(4, "/update_mv/init", self)
+        
+        # state /update_mv/x
+        self.states["/update_mv/x"] = State(5, "/update_mv/x", self)
+        self.states["/update_mv/x"].setEnter(self._update_mv_x_enter)
+        
+        # state /update_mv/y
+        self.states["/update_mv/y"] = State(6, "/update_mv/y", self)
+        self.states["/update_mv/y"].setEnter(self._update_mv_y_enter)
+        
         # add children
         # add children
         self.states[""].addChild(self.states["/main"])
         self.states[""].addChild(self.states["/main"])
         self.states[""].addChild(self.states["/dragging"])
         self.states[""].addChild(self.states["/dragging"])
+        self.states[""].addChild(self.states["/update_mv"])
+        self.states["/update_mv"].addChild(self.states["/update_mv/init"])
+        self.states["/update_mv"].addChild(self.states["/update_mv/x"])
+        self.states["/update_mv"].addChild(self.states["/update_mv/y"])
         self.states[""].fixTree()
         self.states[""].fixTree()
         self.states[""].default_state = self.states["/main"]
         self.states[""].default_state = self.states["/main"]
+        self.states["/update_mv"].default_state = self.states["/update_mv/init"]
         
         
         # transition /main
         # transition /main
         _main_0 = Transition(self, self.states["/main"], [self.states["/main"]])
         _main_0 = Transition(self, self.states["/main"], [self.states["/main"]])
@@ -5719,11 +5762,40 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
         _dragging_0.setTrigger(Event("motion", None))
         _dragging_0.setTrigger(Event("motion", None))
         _dragging_0.setGuard(self._dragging_0_guard)
         _dragging_0.setGuard(self._dragging_0_guard)
         self.states["/dragging"].addTransition(_dragging_0)
         self.states["/dragging"].addTransition(_dragging_0)
-        _dragging_1 = Transition(self, self.states["/dragging"], [self.states["/main"]])
+        _dragging_1 = Transition(self, self.states["/dragging"], [self.states["/update_mv"]])
         _dragging_1.setAction(self._dragging_1_exec)
         _dragging_1.setAction(self._dragging_1_exec)
         _dragging_1.setTrigger(Event("left-release", None))
         _dragging_1.setTrigger(Event("left-release", None))
         _dragging_1.setGuard(self._dragging_1_guard)
         _dragging_1.setGuard(self._dragging_1_guard)
         self.states["/dragging"].addTransition(_dragging_1)
         self.states["/dragging"].addTransition(_dragging_1)
+        
+        # transition /update_mv/init
+        _update_mv_init_0 = Transition(self, self.states["/update_mv/init"], [self.states["/update_mv/x"]])
+        _update_mv_init_0.setAction(self._update_mv_init_0_exec)
+        _update_mv_init_0.setTrigger(None)
+        _update_mv_init_0.setGuard(self._update_mv_init_0_guard)
+        self.states["/update_mv/init"].addTransition(_update_mv_init_0)
+        _update_mv_init_1 = Transition(self, self.states["/update_mv/init"], [self.states["/main"]])
+        _update_mv_init_1.setTrigger(None)
+        _update_mv_init_1.setGuard(self._update_mv_init_1_guard)
+        self.states["/update_mv/init"].addTransition(_update_mv_init_1)
+        
+        # transition /update_mv/x
+        _update_mv_x_0 = Transition(self, self.states["/update_mv/x"], [self.states["/update_mv/y"]])
+        _update_mv_x_0.setTrigger(Event("mv_response", None))
+        self.states["/update_mv/x"].addTransition(_update_mv_x_0)
+        
+        # transition /update_mv/y
+        _update_mv_y_0 = Transition(self, self.states["/update_mv/y"], [self.states["/update_mv/init"]])
+        _update_mv_y_0.setTrigger(Event("mv_response", None))
+        self.states["/update_mv/y"].addTransition(_update_mv_y_0)
+    
+    def _update_mv_x_enter(self):
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_rendered_model, self.tmp['mv_id'], 'x', self.tmp['x']]])]))
+        print("Update X")
+    
+    def _update_mv_y_enter(self):
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_rendered_model, self.tmp['mv_id'], 'y', self.tmp['y']]])]))
+        print("Update Y")
     
     
     def _main_0_exec(self, parameters):
     def _main_0_exec(self, parameters):
         element = parameters[0]
         element = parameters[0]
@@ -5740,14 +5812,12 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
             result = None
             result = None
         
         
         if result is not None:
         if result is not None:
-            self.elements.append(result)
+            self.elements[result] = element["id"]
             self.set_bindable_and_tagorid(self.containing_canvas, result)
             self.set_bindable_and_tagorid(self.containing_canvas, result)
     
     
     def _main_1_exec(self, parameters):
     def _main_1_exec(self, parameters):
         ID = parameters[0]
         ID = parameters[0]
-        print("LEFT CLICK on canvas element at " + str(self.coordinates))
         self.original_coords = self.last_x, self.last_y
         self.original_coords = self.last_x, self.last_y
-        print("Store click location: " + str(self.original_coords))
     
     
     def _main_1_guard(self, parameters):
     def _main_1_guard(self, parameters):
         ID = parameters[0]
         ID = parameters[0]
@@ -5773,14 +5843,23 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
     
     
     def _dragging_1_exec(self, parameters):
     def _dragging_1_exec(self, parameters):
         ID = parameters[0]
         ID = parameters[0]
-        print("Release at %s, so move coordinates" % str((self.last_x, self.last_y)))
         self.coordinates = self.coordinates[0] - (self.original_coords[0] - self.last_x), self.coordinates[1] - (self.original_coords[1] - self.last_y)
         self.coordinates = self.coordinates[0] - (self.original_coords[0] - self.last_x), self.coordinates[1] - (self.original_coords[1] - self.last_y)
-        print("New coordinates of element: %s" % str(self.coordinates))
+        self.to_update = dict(self.elements)
     
     
     def _dragging_1_guard(self, parameters):
     def _dragging_1_guard(self, parameters):
         ID = parameters[0]
         ID = parameters[0]
         return id(self) == ID
         return id(self) == ID
     
     
+    def _update_mv_init_0_exec(self, parameters):
+        tk_id, self.tmp["mv_id"] = self.to_update.popitem()
+        self.tmp['x'], self.tmp['y'] = self.containing_canvas.coords(tk_id)[:2]
+    
+    def _update_mv_init_0_guard(self, parameters):
+        return len(self.to_update) > 0
+    
+    def _update_mv_init_1_guard(self, parameters):
+        return len(self.to_update) == 0
+    
     def initializeStatechart(self):
     def initializeStatechart(self):
         # enter default state
         # enter default state
         self.default_targets = self.states["/main"].getEffectiveTargetStates()
         self.default_targets = self.states["/main"].getEffectiveTargetStates()

+ 3 - 0
frontend.xml

@@ -10,6 +10,9 @@
         import uuid
         import uuid
         import json
         import json
         import urllib
         import urllib
+        
+        global current_model
+        global current_metamodel
     </top>
     </top>
 
 
     <inport name="input"/>
     <inport name="input"/>