瀏覽代碼

Add tracability link in render_SCD activity

Yentl Van Tendeloo 8 年之前
父節點
當前提交
94cead57c0
共有 4 個文件被更改,包括 180 次插入49 次删除
  1. 41 12
      classes/main_app.xml
  2. 20 0
      classes/modelverse/modelverse.xml
  3. 105 37
      frontend.py
  4. 14 0
      models/render_SCD.alc

+ 41 - 12
classes/main_app.xml

@@ -209,21 +209,50 @@
                                 </transition>
                             </state>
 
-                            <state id="modify_render_SCD">
-                                <onentry>
-                                    <raise event="mv_request_context">
-                                        <parameter expr="'exit'"/>
-                                        <parameter expr="[]"/>
-                                        <parameter expr="self.context"/>
-                                    </raise>
-                                </onentry>
-
-                                <transition event="mv_exception" target="../../../wait_close_splash"/>
-                                <transition event="mv_response" target="../../../wait_close_splash">
+                            <state id="modify_render_SCD" initial="trace_class">
+                                <onexit>
                                     <script>
                                         self.context = None
                                     </script>
-                                </transition>
+                                </onexit>
+
+                                <state id="trace_class">
+                                    <onentry>
+                                        <raise event="mv_request_context">
+                                            <parameter expr="'instantiate'"/>
+                                            <parameter expr="[None, 'Association', ('abstract/Class', 'rendered/Group'), 'TracabilityClass']"/>
+                                            <parameter expr="self.context"/>
+                                        </raise>
+                                    </onentry>
+
+                                    <transition event="mv_response" target="../trace_association"/>
+                                </state>
+
+                                <state id="trace_association">
+                                    <onentry>
+                                        <raise event="mv_request_context">
+                                            <parameter expr="'instantiate'"/>
+                                            <parameter expr="[None, 'Association', ('abstract/Association', 'rendered/Group'), 'TracabilityAssociation']"/>
+                                            <parameter expr="self.context"/>
+                                        </raise>
+                                    </onentry>
+
+                                    <transition event="mv_response" target="../exit"/>
+                                </state>
+
+                                <state id="exit">
+                                    <onentry>
+                                        <raise event="mv_request_context">
+                                            <parameter expr="'exit'"/>
+                                            <parameter expr="[]"/>
+                                            <parameter expr="self.context"/>
+                                        </raise>
+                                    </onentry>
+
+                                    <transition event="mv_response" target="../../../../wait_close_splash"/>
+                                </state>
+
+                                <transition event="mv_exception" target="../../../wait_close_splash"/>
                             </state>
                         </state>
                     </state>

+ 20 - 0
classes/modelverse/modelverse.xml

@@ -1184,6 +1184,9 @@
                             <raise event="request">
                                 <parameter expr="['attr_add', self.parameters[1], self.parameters[2], self.parameters[3]]"/>
                             </raise>
+                            <script>
+                                print("Attr assign for parameters: " + str(self.parameters))
+                            </script>
                         </onentry>
 
                         <transition cond="self.expect_response('Success')" target="../../wait_for_action/history">
@@ -1319,6 +1322,17 @@
                         </transition>
                     </state>
 
+                    <state id="save">
+                        <onentry>
+                            <raise event="request">
+                                <parameter expr="['exit', 'model_modify', self.current_model]"/>
+                            </raise>
+                        </onentry>
+
+                        <transition cond="self.expect_response('Success')" target="."/>
+                        <transition cond="self.expect_response('Model loaded, ready for commands!')" target="../../wait_for_action/modelling/recognized/manual"/>
+                    </state>
+
                     <transition cond="self.expect_response_partial('Element not found: ', pop=False)" target="../wait_for_action/history">
                         <raise event="exception">
                             <parameter expr="'UnknownIdentifier'"/>
@@ -1710,6 +1724,12 @@
                                     self.load_action(self.context)
                                 </script>
                             </transition>
+
+                            <transition cond="self.expect_action(self.context, 'save')" target="../../../operations/save">
+                                <script>
+                                    self.load_action(self.context)
+                                </script>
+                            </transition>
                         </state>
 
                         <transition cond="self.context is not None and self.actions[self.context]" target="../history">

+ 105 - 37
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:   Thu Sep 14 11:21:54 2017
+Date:   Thu Sep 14 16:38:00 2017
 
 Model author: Yentl Van Tendeloo and Addis Gebremichael
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -115,33 +115,45 @@ class MainApp(RuntimeClassBase):
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"] = State(16, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD", self)
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_enter)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"].setExit(self._parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_exit)
+        
+        # state /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class"] = State(17, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_trace_class_enter)
+        
+        # state /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association"] = State(18, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_trace_association_enter)
+        
+        # state /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit"] = State(19, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_exit_enter)
         
         # state /parallel/behaviour/init_modelverse/wait_close_splash
-        self.states["/parallel/behaviour/init_modelverse/wait_close_splash"] = State(17, "/parallel/behaviour/init_modelverse/wait_close_splash", self)
+        self.states["/parallel/behaviour/init_modelverse/wait_close_splash"] = State(20, "/parallel/behaviour/init_modelverse/wait_close_splash", self)
         self.states["/parallel/behaviour/init_modelverse/wait_close_splash"].setEnter(self._parallel_behaviour_init_modelverse_wait_close_splash_enter)
         self.states["/parallel/behaviour/init_modelverse/wait_close_splash"].setExit(self._parallel_behaviour_init_modelverse_wait_close_splash_exit)
         
         # state /parallel/behaviour/init_modelverse/closing_splash
-        self.states["/parallel/behaviour/init_modelverse/closing_splash"] = State(18, "/parallel/behaviour/init_modelverse/closing_splash", self)
+        self.states["/parallel/behaviour/init_modelverse/closing_splash"] = State(21, "/parallel/behaviour/init_modelverse/closing_splash", self)
         self.states["/parallel/behaviour/init_modelverse/closing_splash"].setEnter(self._parallel_behaviour_init_modelverse_closing_splash_enter)
         
         # state /parallel/behaviour/init_main_window
-        self.states["/parallel/behaviour/init_main_window"] = State(19, "/parallel/behaviour/init_main_window", self)
+        self.states["/parallel/behaviour/init_main_window"] = State(22, "/parallel/behaviour/init_main_window", self)
         self.states["/parallel/behaviour/init_main_window"].setEnter(self._parallel_behaviour_init_main_window_enter)
         
         # state /parallel/behaviour/main_behaviour
-        self.states["/parallel/behaviour/main_behaviour"] = State(20, "/parallel/behaviour/main_behaviour", self)
+        self.states["/parallel/behaviour/main_behaviour"] = State(23, "/parallel/behaviour/main_behaviour", self)
         
         # state /parallel/behaviour/stopped
-        self.states["/parallel/behaviour/stopped"] = State(21, "/parallel/behaviour/stopped", self)
+        self.states["/parallel/behaviour/stopped"] = State(24, "/parallel/behaviour/stopped", self)
         self.states["/parallel/behaviour/stopped"].setEnter(self._parallel_behaviour_stopped_enter)
         
         # state /parallel/forward_requests
-        self.states["/parallel/forward_requests"] = State(22, "/parallel/forward_requests", self)
+        self.states["/parallel/forward_requests"] = State(25, "/parallel/forward_requests", self)
         
         # state /parallel/forward_requests/forward
-        self.states["/parallel/forward_requests/forward"] = State(23, "/parallel/forward_requests/forward", self)
+        self.states["/parallel/forward_requests/forward"] = State(26, "/parallel/forward_requests/forward", self)
         
         # add children
         self.states[""].addChild(self.states["/parallel"])
@@ -166,6 +178,9 @@ class MainApp(RuntimeClassBase):
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_MM_render"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_render_SCD"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"])
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class"])
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association"])
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit"])
         self.states["/parallel/forward_requests"].addChild(self.states["/parallel/forward_requests/forward"])
         self.states[""].fixTree()
         self.states[""].default_state = self.states["/parallel"]
@@ -174,6 +189,7 @@ class MainApp(RuntimeClassBase):
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].default_state = self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"]
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"].default_state = self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive"]
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models"].default_state = self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_MM_render"]
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"].default_state = self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class"]
         self.states["/parallel/forward_requests"].default_state = self.states["/parallel/forward_requests/forward"]
         
         # transition /parallel/behaviour/init_modelverse/splash
@@ -243,14 +259,20 @@ class MainApp(RuntimeClassBase):
         _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_upload_render_SCD_1.setTrigger(Event("mv_response", None))
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_render_SCD"].addTransition(_parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_upload_render_SCD_1)
         
-        # transition /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD
-        _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"], [self.states["/parallel/behaviour/init_modelverse/wait_close_splash"]])
-        _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_0.setTrigger(Event("mv_exception", None))
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"].addTransition(_parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_0)
-        _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_1 = Transition(self, self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"], [self.states["/parallel/behaviour/init_modelverse/wait_close_splash"]])
-        _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_1.setAction(self._parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_1_exec)
-        _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_1.setTrigger(Event("mv_response", None))
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"].addTransition(_parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_1)
+        # transition /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class
+        _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_trace_class_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class"], [self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association"]])
+        _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_trace_class_0.setTrigger(Event("mv_response", None))
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class"].addTransition(_parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_trace_class_0)
+        
+        # transition /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association
+        _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_trace_association_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association"], [self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit"]])
+        _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_trace_association_0.setTrigger(Event("mv_response", None))
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association"].addTransition(_parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_trace_association_0)
+        
+        # transition /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit
+        _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_exit_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit"], [self.states["/parallel/behaviour/init_modelverse/wait_close_splash"]])
+        _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_exit_0.setTrigger(Event("mv_response", None))
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit"].addTransition(_parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_exit_0)
         
         # transition /parallel/behaviour/init_modelverse/wait_close_splash
         _parallel_behaviour_init_modelverse_wait_close_splash_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/wait_close_splash"], [self.states["/parallel/behaviour/init_modelverse/closing_splash"]])
@@ -291,10 +313,18 @@ class MainApp(RuntimeClassBase):
         _parallel_forward_requests_forward_3.setAction(self._parallel_forward_requests_forward_3_exec)
         _parallel_forward_requests_forward_3.setTrigger(Event("mv_exception", None))
         self.states["/parallel/forward_requests/forward"].addTransition(_parallel_forward_requests_forward_3)
+        
+        # transition /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD
+        _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"], [self.states["/parallel/behaviour/init_modelverse/wait_close_splash"]])
+        _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_0.setTrigger(Event("mv_exception", None))
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"].addTransition(_parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_0)
     
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_wait_for_credentials_exit(self):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.prompt_window]))
     
+    def _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_exit(self):
+        self.context = None
+    
     def _parallel_behaviour_init_modelverse_splash_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'windows', 'SplashWindow']))
     
@@ -324,7 +354,13 @@ class MainApp(RuntimeClassBase):
         self.raiseInternalEvent(Event("mv_request", None, ['transformation_add_AL', [{'rendered': 'formalisms/MM_render', 'abstract': 'formalisms/SimpleClassDiagrams'}, {'rendered': 'formalisms/MM_render', 'abstract': 'formalisms/SimpleClassDiagrams'}, 'models/render_SCD', open('models/render_SCD.alc', 'r').read()]]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.splash_window, Event("update_status", None, [80, 'Uploading render_SCD...'])]))
     
-    def _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_enter(self):
+    def _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_trace_class_enter(self):
+        self.raiseInternalEvent(Event("mv_request_context", None, ['instantiate', [None, 'Association', ('abstract/Class', 'rendered/Group'), 'TracabilityClass'], self.context]))
+    
+    def _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_trace_association_enter(self):
+        self.raiseInternalEvent(Event("mv_request_context", None, ['instantiate', [None, 'Association', ('abstract/Association', 'rendered/Group'), 'TracabilityAssociation'], self.context]))
+    
+    def _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_exit_enter(self):
         self.raiseInternalEvent(Event("mv_request_context", None, ['exit', [], self.context]))
     
     def _parallel_behaviour_init_modelverse_wait_close_splash_enter(self):
@@ -381,9 +417,6 @@ class MainApp(RuntimeClassBase):
         context = parameters[0]
         self.context = context
     
-    def _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_1_exec(self, parameters):
-        self.context = None
-    
     def _parallel_behaviour_init_modelverse_closing_splash_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.splash_window]))
     
@@ -400,7 +433,6 @@ class MainApp(RuntimeClassBase):
     def _parallel_forward_requests_forward_1_exec(self, parameters):
         name = parameters[0]
         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])]))
     
     def _parallel_forward_requests_forward_2_exec(self, parameters):
@@ -888,53 +920,57 @@ class Modelverse(RuntimeClassBase):
         self.states["/initialized/behaviour/operations/all_instances"] = State(103, "/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(104, "/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(104, "/initialized/behaviour/wait_for_action", self)
+        self.states["/initialized/behaviour/wait_for_action"] = State(105, "/initialized/behaviour/wait_for_action", self)
         
         # state /initialized/behaviour/wait_for_action/disconnected
-        self.states["/initialized/behaviour/wait_for_action/disconnected"] = State(105, "/initialized/behaviour/wait_for_action/disconnected", self)
+        self.states["/initialized/behaviour/wait_for_action/disconnected"] = State(106, "/initialized/behaviour/wait_for_action/disconnected", self)
         
         # state /initialized/behaviour/wait_for_action/connected
-        self.states["/initialized/behaviour/wait_for_action/connected"] = State(106, "/initialized/behaviour/wait_for_action/connected", self)
+        self.states["/initialized/behaviour/wait_for_action/connected"] = State(107, "/initialized/behaviour/wait_for_action/connected", self)
         
         # state /initialized/behaviour/wait_for_action/megamodelling
-        self.states["/initialized/behaviour/wait_for_action/megamodelling"] = State(107, "/initialized/behaviour/wait_for_action/megamodelling", self)
+        self.states["/initialized/behaviour/wait_for_action/megamodelling"] = State(108, "/initialized/behaviour/wait_for_action/megamodelling", self)
         
         # state /initialized/behaviour/wait_for_action/modelling
-        self.states["/initialized/behaviour/wait_for_action/modelling"] = State(108, "/initialized/behaviour/wait_for_action/modelling", self)
+        self.states["/initialized/behaviour/wait_for_action/modelling"] = State(109, "/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(109, "/initialized/behaviour/wait_for_action/modelling/recognized", self)
+        self.states["/initialized/behaviour/wait_for_action/modelling/recognized"] = State(110, "/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(110, "/initialized/behaviour/wait_for_action/modelling/recognized/manual", self)
+        self.states["/initialized/behaviour/wait_for_action/modelling/recognized/manual"] = State(111, "/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(111, "/initialized/behaviour/wait_for_action/modelling/recognized/scripted", self)
+        self.states["/initialized/behaviour/wait_for_action/modelling/recognized/scripted"] = State(112, "/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(112, "/initialized/behaviour/wait_for_action/finished", self)
+        self.states["/initialized/behaviour/wait_for_action/finished"] = State(113, "/initialized/behaviour/wait_for_action/finished", self)
         
         # state /initialized/behaviour/wait_for_action/history
-        self.states["/initialized/behaviour/wait_for_action/history"] = DeepHistoryState(113, "/initialized/behaviour/wait_for_action/history", self)
+        self.states["/initialized/behaviour/wait_for_action/history"] = DeepHistoryState(114, "/initialized/behaviour/wait_for_action/history", self)
         
         # state /initialized/behaviour/going_manual
-        self.states["/initialized/behaviour/going_manual"] = State(114, "/initialized/behaviour/going_manual", self)
+        self.states["/initialized/behaviour/going_manual"] = State(115, "/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(115, "/initialized/behaviour/going_scripted", self)
+        self.states["/initialized/behaviour/going_scripted"] = State(116, "/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(116, "/initialized/behaviour/leaving_manual", self)
+        self.states["/initialized/behaviour/leaving_manual"] = State(117, "/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(117, "/initialized/queue", self)
+        self.states["/initialized/queue"] = State(118, "/initialized/queue", self)
         
         # state /initialized/queue/queue
-        self.states["/initialized/queue/queue"] = State(118, "/initialized/queue/queue", self)
+        self.states["/initialized/queue/queue"] = State(119, "/initialized/queue/queue", self)
         
         # add children
         self.states[""].addChild(self.states["/init"])
@@ -1007,6 +1043,7 @@ class Modelverse(RuntimeClassBase):
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/connections_between"])
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/define_attribute"])
         self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/all_instances"])
+        self.states["/initialized/behaviour/operations"].addChild(self.states["/initialized/behaviour/operations/save"])
         self.states["/initialized/behaviour/operations/model_add"].addChild(self.states["/initialized/behaviour/operations/model_add/send_metadata"])
         self.states["/initialized/behaviour/operations/model_upload"].addChild(self.states["/initialized/behaviour/operations/model_upload/send_metadata"])
         self.states["/initialized/behaviour/operations/model_upload"].addChild(self.states["/initialized/behaviour/operations/model_upload/send_model"])
@@ -1722,6 +1759,16 @@ class Modelverse(RuntimeClassBase):
         _initialized_behaviour_operations_all_instances_0.setGuard(self._initialized_behaviour_operations_all_instances_0_guard)
         self.states["/initialized/behaviour/operations/all_instances"].addTransition(_initialized_behaviour_operations_all_instances_0)
         
+        # transition /initialized/behaviour/operations/save
+        _initialized_behaviour_operations_save_0 = Transition(self, self.states["/initialized/behaviour/operations/save"], [self.states["/initialized/behaviour/operations/save"]])
+        _initialized_behaviour_operations_save_0.setTrigger(None)
+        _initialized_behaviour_operations_save_0.setGuard(self._initialized_behaviour_operations_save_0_guard)
+        self.states["/initialized/behaviour/operations/save"].addTransition(_initialized_behaviour_operations_save_0)
+        _initialized_behaviour_operations_save_1 = Transition(self, self.states["/initialized/behaviour/operations/save"], [self.states["/initialized/behaviour/wait_for_action/modelling/recognized/manual"]])
+        _initialized_behaviour_operations_save_1.setTrigger(None)
+        _initialized_behaviour_operations_save_1.setGuard(self._initialized_behaviour_operations_save_1_guard)
+        self.states["/initialized/behaviour/operations/save"].addTransition(_initialized_behaviour_operations_save_1)
+        
         # transition /initialized/behaviour/wait_for_action/disconnected
         _initialized_behaviour_wait_for_action_disconnected_0 = Transition(self, self.states["/initialized/behaviour/wait_for_action/disconnected"], [self.states["/initialized/behaviour/init"]])
         _initialized_behaviour_wait_for_action_disconnected_0.setAction(self._initialized_behaviour_wait_for_action_disconnected_0_exec)
@@ -2130,6 +2177,11 @@ class Modelverse(RuntimeClassBase):
         _initialized_behaviour_wait_for_action_modelling_recognized_18.setTrigger(None)
         _initialized_behaviour_wait_for_action_modelling_recognized_18.setGuard(self._initialized_behaviour_wait_for_action_modelling_recognized_18_guard)
         self.states["/initialized/behaviour/wait_for_action/modelling/recognized"].addTransition(_initialized_behaviour_wait_for_action_modelling_recognized_18)
+        _initialized_behaviour_wait_for_action_modelling_recognized_19 = Transition(self, self.states["/initialized/behaviour/wait_for_action/modelling/recognized"], [self.states["/initialized/behaviour/operations/save"]])
+        _initialized_behaviour_wait_for_action_modelling_recognized_19.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)
     
     def _initialized_enter(self):
         self.raiseInternalEvent(Event("ready", None, []))
@@ -2300,6 +2352,7 @@ class Modelverse(RuntimeClassBase):
     
     def _initialized_behaviour_operations_attr_assign_enter(self):
         self.raiseInternalEvent(Event("request", None, [['attr_add', self.parameters[1], self.parameters[2], self.parameters[3]]]))
+        print("Attr assign for parameters: " + str(self.parameters))
     
     def _initialized_behaviour_operations_attr_assign_code_enter(self):
         self.raiseInternalEvent(Event("request", None, [['attr_add_code', self.parameters[1], self.parameters[2], self.parameters[3]]]))
@@ -2328,6 +2381,9 @@ class Modelverse(RuntimeClassBase):
     def _initialized_behaviour_operations_all_instances_enter(self):
         self.raiseInternalEvent(Event("request", None, [['all_instances', self.parameters[1]]]))
     
+    def _initialized_behaviour_operations_save_enter(self):
+        self.raiseInternalEvent(Event("request", None, [['exit', 'model_modify', self.current_model]]))
+    
     def _initialized_behaviour_going_manual_enter(self):
         self.context = None
         self.current_model = self.actions[None][0]["parameters"][0]
@@ -2502,6 +2558,12 @@ class Modelverse(RuntimeClassBase):
     def _initialized_behaviour_wait_for_action_modelling_recognized_18_guard(self, parameters):
         return self.expect_action(self.context, 'all_instances')
     
+    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, 'save')
+    
     def _init_0_exec(self, parameters):
         instance = parameters[0]
         self.http_clients.append(instance)
@@ -3057,6 +3119,12 @@ class Modelverse(RuntimeClassBase):
     def _initialized_behaviour_operations_all_instances_0_guard(self, parameters):
         return self.expect_response_partial('Success: ', pop=False)
     
+    def _initialized_behaviour_operations_save_0_guard(self, parameters):
+        return self.expect_response('Success')
+    
+    def _initialized_behaviour_operations_save_1_guard(self, parameters):
+        return self.expect_response('Model loaded, ready for commands!')
+    
     def _initialized_behaviour_wait_for_action_disconnected_0_exec(self, parameters):
         self.load_action(None)
     

+ 14 - 0
models/render_SCD.alc

@@ -22,6 +22,11 @@ Boolean function main(model : Element):
 	elements = allInstances(model, "abstract/Class")
 	while (set_len(elements) > 0):
 		class = set_pop(elements)
+		
+		if (set_len(allOutgoingAssociationInstances(model, class, "TracabilityClass")) > 0):
+			log("Skip draw of class")
+			continue!
+
 		attr_keys = dict_keys(getAttributeList(model, class))
 		text_loc = 5
 
@@ -86,9 +91,16 @@ Boolean function main(model : Element):
 			instantiate_link(model, "rendered/contains", "", group, elem)
 			text_loc = text_loc + 15
 
+		instantiate_link(model, "TracabilityClass", "", class, group)
+
 	elements = allInstances(model, "abstract/Association")
 	while (set_len(elements) > 0):
 		class = set_pop(elements)
+
+		if (set_len(allOutgoingAssociationInstances(model, class, "TracabilityAssociation")) > 0):
+			log("Skip draw of association")
+			continue!
+
 		attr_keys = dict_keys(getAttributeList(model, class))
 
 		group = instantiate_node(model, "rendered/Group", "")
@@ -119,4 +131,6 @@ Boolean function main(model : Element):
 			attr_key = set_pop(attr_keys)
 			log((("  " + attr_key) + " = ") + cast_v2s(read_attribute(model, class, attr_key)))
 
+		instantiate_link(model, "TracabilityAssociation", "", class, group)
+
 	return True!