Procházet zdrojové kódy

Add preliminary process enactor

Yentl Van Tendeloo před 7 roky
rodič
revize
d317508bf0

+ 7 - 1
classes/toolbar/generic_toolbar.xml

@@ -11,11 +11,12 @@
             <parameter expr="parent"/>
         </super>
         <body>
-            self.to_create = ["new", "open", "activity", "create_activity"]
+            self.to_create = ["new", "open", "activity", "create_activity", "enact_process"]
             self.button_info = {"new": "Create a new model",
                                 "open": "Open an existing model",
                                 "activity": "Perform an activity",
                                 "create_activity": "Create a new activity",
+                                "enact_process": "Enact process",
                                }
             self.buttons = {}
             tk.Label(self, text="Generic").pack(side=tk.LEFT)
@@ -92,6 +93,11 @@
                 <raise event="create_activity" scope="narrow" target="'parent'"/>
             </transition>
 
+            <transition event="button_pressed" cond="event_name == 'enact_process'" target=".">
+                <parameter name="event_name"/>
+                <raise event="enact_process" scope="narrow" target="'parent'"/>
+            </transition>
+
             <transition event="close" target="../closing"/>
         </state>
 

+ 30 - 0
classes/window/main_window.xml

@@ -125,6 +125,7 @@
                         <transition event="add_object_diagrams" target="../add_object_diagrams"/>
                         <transition event="activity" target="../execute_activity"/>
                         <transition event="create_activity" target="../create_activity"/>
+                        <transition event="enact_process" target="../enact_process"/>
                         <transition event="modify_defined_attrs" target="../modify_defined_attrs">
                             <parameter name="as_element"/>
                             <parameter name="cs_element"/>
@@ -271,6 +272,35 @@
                         </state>
                     </state>
 
+                    <state id="enact_process" initial="open_window">
+                        <state id="open_window">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'subwindow'"/>
+                                    <parameter expr="'ProcessEnactor'"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="instance_created" target="../waiting">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                                <script>
+                                    self.process_enactor = assoc_name
+                                </script>
+                            </transition>
+                        </state>
+
+                        <state id="waiting">
+                            <transition event="close_window" target="../../idle">
+                                <raise event="delete_instance" scope="cd">
+                                    <parameter expr="self.process_enactor"/>
+                                </raise>
+                            </transition>
+                        </state>
+                    </state>
+
                     <state id="add_object_diagrams" initial="init">
                         <state id="init">
                             <onentry>

+ 485 - 0
classes/window/process_enact.xml

@@ -0,0 +1,485 @@
+<class name="ProcessEnactor">
+    <relationships>
+        <inheritance class="tk.Toplevel" priority="1"/>
+        <inheritance class="SCCDWidget" priority="0"/>
+        <association name="activity_browse" class="A"/>
+        <association name="model_browse_button" class="Button"/>
+        <association name="model_browse_entry" class="Entry"/>
+        <association name="model_browse_label" class="Label"/>
+        <association name="browsers" class="Browser"/>
+        <association name="parent" class="A"/>
+    </relationships>
+
+    <constructor>
+        <super class="tk.TopLevel"/>
+        <super class="SCCDWidget"/>
+        <body>
+            self.activity_frame = tk.Frame(self)
+            self.input_frame = tk.Frame(self)
+            self.exec_frame = tk.Frame(self)
+
+            self.activity_frame.pack()
+            tk.Label(self, text="Bindings").pack()
+            self.input_frame.pack()
+            self.exec_frame.pack()
+
+            self.stored_associations = {}
+            self.current = None
+            self.activity = None
+
+            self.exec_input_signature = {}
+            self.exec_output_signature = {}
+        </body>
+    </constructor>
+
+    <destructor>
+        <body>
+            self.destroy()
+        </body>
+    </destructor>
+
+    <scxml initial="all">
+        <state id="all" initial="create_activity_browse_label">
+            <state id="create_activity_browse_label" initial="create">
+                <state id="create">
+                    <onentry>
+                        <raise event="create_instance" scope="cd">
+                            <parameter expr="'activity_browse'"/>
+                            <parameter expr="'Label'"/>
+                            <parameter expr="{'parent': self.activity_frame, 'text': 'Activity'}"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="instance_created" target="../pack">
+                        <parameter name="assoc_name"/>
+                        <raise event="start_instance" scope="cd">
+                            <parameter expr="assoc_name"/>
+                        </raise>
+                    </transition>
+                </state>
+
+                <state id="pack">
+                    <transition event="tk_widget" target="../../create_activity_browse_entry">
+                        <parameter name="tk_widget"/>
+                        <script>
+                            tk_widget.grid(row=0,column=0)
+                        </script>
+                    </transition>
+                </state>
+            </state>
+
+            <state id="create_activity_browse_entry" initial="create">
+                <state id="create">
+                    <onentry>
+                        <raise event="create_instance" scope="cd">
+                            <parameter expr="'activity_browse'"/>
+                            <parameter expr="'Entry'"/>
+                            <parameter expr="{'parent': self.activity_frame, 'name': 'activity_entry', 'value': '(none)', 'readonly': True}"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="instance_created" target="../pack">
+                        <parameter name="assoc_name"/>
+                        <raise event="start_instance" scope="cd">
+                            <parameter expr="assoc_name"/>
+                        </raise>
+                        <script>
+                            self.activity_entry = assoc_name
+                        </script>
+                    </transition>
+                </state>
+
+                <state id="pack">
+                    <transition event="tk_widget" target="../../create_activity_browse_button">
+                        <parameter name="tk_widget"/>
+                        <script>
+                            tk_widget.grid(row=0,column=1)
+                        </script>
+                    </transition>
+                </state>
+            </state>
+
+            <state id="create_activity_browse_button" initial="create">
+                <state id="create">
+                    <onentry>
+                        <raise event="create_instance" scope="cd">
+                            <parameter expr="'activity_browse'"/>
+                            <parameter expr="'Button'"/>
+                            <parameter expr="{'parent': self.activity_frame, 'event_parameters': 'browse_activity', 'visual': TextVisual('...'), 'tooltip_text': 'Browse for a activity'}"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="instance_created" target="../pack">
+                        <parameter name="assoc_name"/>
+                        <raise event="start_instance" scope="cd">
+                            <parameter expr="assoc_name"/>
+                        </raise>
+                    </transition>
+                </state>
+
+                <state id="pack">
+                    <transition event="tk_widget" target="../../create_exec">
+                        <parameter name="tk_widget"/>
+                        <script>
+                            tk_widget.grid(row=0,column=2)
+                        </script>
+                    </transition>
+                </state>
+            </state>
+
+            <state id="create_exec" initial="create">
+                <state id="create">
+                    <onentry>
+                        <raise event="create_instance" scope="cd">
+                            <parameter expr="'activity_browse'"/>
+                            <parameter expr="'Button'"/>
+                            <parameter expr="{'parent': self.exec_frame, 'event_parameters': 'execute', 'visual': TextVisual('EXECUTE'), 'tooltip_text': 'Execute the activity'}"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="instance_created" target="../pack">
+                        <parameter name="assoc_name"/>
+                        <raise event="start_instance" scope="cd">
+                            <parameter expr="assoc_name"/>
+                        </raise>
+                    </transition>
+                </state>
+
+                <state id="pack">
+                    <transition event="tk_widget" target="../../ready">
+                        <parameter name="tk_widget"/>
+                        <script>
+                            tk_widget.pack()
+                        </script>
+                    </transition>
+                </state>
+            </state>
+
+            <state id="ready">
+                <transition event="button_pressed" cond="event_name == 'browse_activity'" target="../browse_activity">
+                    <parameter name="event_name"/>
+                </transition>
+                <transition event="button_pressed" cond="event_name.startswith('input_')" target="../browse_model">
+                    <parameter name="event_name"/>
+                    <script>
+                        self.current = event_name
+                        self.required_type = [self.input_signature[event_name.split("input_", 1)[1]]]
+                    </script>
+                </transition>
+                <transition event="changed_entry" target=".">
+                    <parameter name="event_name"/>
+                    <parameter name="value"/>
+                    <script>
+                        self.exec_input_signature[event_name.split("input_", 1)[1]] = value
+                    </script>
+                </transition>
+                <transition event="button_pressed" cond="event_name == 'execute'" target="../execute">
+                    <parameter name="event_name"/>
+                </transition>
+            </state>
+
+            <state id="execute" initial="check_args">
+                <state id="check_args">
+                    <onentry>
+                        <raise event="change_bg" scope="narrow" target="[self.stored_associations['input_%s' % i] for i in self.input_signature.keys()]">
+                            <parameter expr="'light grey'"/>
+                        </raise>
+                    </onentry>
+                    <transition cond="set(self.exec_input_signature.keys()) == set(self.input_signature.keys())" target="../execute">
+                        <raise event="disable" scope="narrow" target="'model_browse_entry'"/>
+                    </transition>
+                </state>
+
+                <state id="execute">
+                    <onentry>
+                        <script>
+                            print("Executing activity %s" % self.activity)
+                            print("   Inputs  " + str(self.exec_input_signature))
+                        </script>
+
+                        <raise event="mv_request" scope="broad">
+                            <parameter expr="'process_execute'"/>
+                            <parameter expr="[self.activity, self.exec_input_signature]"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="mv_response" target="../in_context">
+                        <parameter name="context"/>
+                        <script>
+                            self.current_context = context
+                        </script>
+                    </transition>
+                </state>
+
+                <state id="in_context">
+                    <!-- TODO Add data_input and data_output -->
+                    <transition event="mv_response" cond="result == True" target="../alter_context_result">
+                        <parameter name="result"/>
+                    </transition>
+                    <transition event="mv_response" cond="result == False" target="../../ready">
+                        <parameter name="result"/>
+                    </transition>
+                </state>
+
+                <state id="alter_context_result" initial="check_next">
+                    <state id="check_next">
+                        <transition cond="self.exec_output_signature" target="../add"/>
+                        <transition cond="not self.exec_output_signature" target="../../../closing"/>
+                    </state>
+
+                    <state id="add">
+                        <onentry>
+                            <script>
+                                tag, model = self.exec_output_signature.popitem()
+                                metamodel = self.output_signature[tag]
+                            </script>
+                            <raise event="mv_request" scope="broad">
+                                <parameter expr="'alter_context'"/>
+                                <parameter expr="[model, metamodel]"/>
+                            </raise>
+                        </onentry>
+
+                        <transition event="mv_response" target="../check_next"/>
+                    </state>
+                </state>
+            </state>
+
+            <state id="browse_activity" initial="create_browser">
+                <state id="create_browser">
+                    <onentry>
+                        <raise event="create_instance" scope="cd">
+                            <parameter expr="'browsers'"/>
+                            <parameter expr="'Browser'"/>
+                            <parameter expr="'Select activity to execute.'"/>
+                            <parameter expr="None"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="instance_created" target="../waiting_for_decision">
+                        <parameter name="assoc_name"/>
+                        <raise event="start_instance" scope="cd">
+                            <parameter expr="assoc_name"/>
+                        </raise>
+                    </transition>
+                </state>
+
+                <state id="waiting_for_decision">
+                    <transition event="browse_result" target=".">
+                        <parameter name="activity"/>
+                        <script>
+                            self.activity = activity
+                        </script>
+                        <raise event="change_value" target="self.activity_entry">
+                            <parameter expr="self.activity"/>
+                        </raise>
+                    </transition>
+
+                    <transition event="close_window" target="../../redraw_signature">
+                        <raise event="delete_instance" scope="cd">
+                            <parameter expr="'browsers'"/>
+                        </raise>
+                    </transition>
+                </state>
+            </state>
+
+            <state id="redraw_signature" initial="clear_previous">
+                <state id="clear_previous">
+                    <transition target="../read_signature">
+                        <raise event="delete_instance" scope="cd">
+                            <parameter expr="'model_browse_label'"/>
+                        </raise>
+                        <raise event="delete_instance" scope="cd">
+                            <parameter expr="'model_browse_button'"/>
+                        </raise>
+                        <raise event="delete_instance" scope="cd">
+                            <parameter expr="'model_browse_entry'"/>
+                        </raise>
+                    </transition>
+                </state>
+
+                <state id="read_signature">
+                    <onentry>
+                        <raise event="mv_request" scope="broad">
+                            <parameter expr="'process_signature'"/>
+                            <parameter expr="[self.activity]"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="mv_response" target="../add_input">
+                        <parameter name="result"/>
+                        <script>
+                            self.input_signature = result
+                        </script>
+                    </transition>
+                </state>
+
+                <state id="add_input" initial="check_next">
+                    <onentry>
+                        <script>
+                            self.counter = -1
+                        </script>
+                    </onentry>
+
+                    <state id="check_next">
+                        <transition cond="self.input_signature_iter" target="../create_label">
+                            <script>
+                                self.counter += 1
+                                self.current = self.input_signature_iter.popitem()
+                            </script>
+                        </transition>
+                        <transition cond="not self.input_signature_iter" target="../../../ready"/>
+                    </state>
+
+                    <state id="create_label">
+                        <onentry>
+                            <raise event="create_instance" scope="cd">
+                                <parameter expr="'model_browse_label'"/>
+                                <parameter expr="'Label'"/>
+                                <parameter expr="{'parent': self.input_frame, 'text': '%s : %s' % self.current}"/>
+                            </raise>
+                        </onentry>
+
+                        <transition event="instance_created" target="../pack_label">
+                            <parameter name="assoc_name"/>
+                            <raise event="start_instance" scope="cd">
+                                <parameter expr="assoc_name"/>
+                            </raise>
+                        </transition>
+                    </state>
+
+                    <state id="pack_label">
+                        <transition event="tk_widget" target="../create_entry">
+                            <parameter name="tk_widget"/>
+                            <script>
+                                tk_widget.grid(row=self.counter,column=0)
+                            </script>
+                        </transition>
+                    </state>
+
+                    <state id="create_entry">
+                        <onentry>
+                            <raise event="create_instance" scope="cd">
+                                <parameter expr="'model_browse_entry'"/>
+                                <parameter expr="'Entry'"/>
+                                <parameter expr="{'parent': self.input_frame, 'name': 'input_%s' % self.current[0], 'value': '', 'readonly': True}"/>
+                            </raise>
+                        </onentry>
+
+                        <transition event="instance_created" target="../pack_entry">
+                            <parameter name="assoc_name"/>
+                            <raise event="start_instance" scope="cd">
+                                <parameter expr="assoc_name"/>
+                            </raise>
+                            <script>
+                                self.stored_associations["input_%s" % self.current[0]] = assoc_name
+                            </script>
+                        </transition>
+                    </state>
+
+                    <state id="pack_entry">
+                        <transition event="tk_widget" target="../create_button">
+                            <parameter name="tk_widget"/>
+                            <script>
+                                tk_widget.grid(row=self.counter, column=1)
+                            </script>
+                        </transition>
+                    </state>
+
+                    <state id="create_button">
+                        <onentry>
+                            <raise event="create_instance" scope="cd">
+                                <parameter expr="'model_browse_button'"/>
+                                <parameter expr="'Button'"/>
+                                <parameter expr="{'parent': self.input_frame, 'visual': TextVisual('...'), 'tooltip_text': 'Select input model for tag %s.' % self.current[0], 'event_parameters': 'input_%s' % self.current[0]}"/>
+                            </raise>
+                        </onentry>
+
+                        <transition event="instance_created" target="../pack_button">
+                            <parameter name="assoc_name"/>
+                            <raise event="start_instance" scope="cd">
+                                <parameter expr="assoc_name"/>
+                            </raise>
+                        </transition>
+                    </state>
+
+                    <state id="pack_button">
+                        <transition event="tk_widget" target="../check_next">
+                            <parameter name="tk_widget"/>
+                            <script>
+                                tk_widget.grid(row=self.counter, column=2)
+                            </script>
+                        </transition>
+                    </state>
+                </state>
+            </state>
+
+            <state id="browse_model" initial="create_browser">
+                <state id="create_browser">
+                    <onentry>
+                        <raise event="create_instance" scope="cd">
+                            <parameter expr="'browsers'"/>
+                            <parameter expr="'Browser'"/>
+                            <parameter expr="'Select model to use.'"/>
+                            <parameter expr="self.required_type"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="instance_created" target="../waiting_for_decision">
+                        <parameter name="assoc_name"/>
+                        <raise event="start_instance" scope="cd">
+                            <parameter expr="assoc_name"/>
+                        </raise>
+                    </transition>
+                </state>
+
+                <state id="waiting_for_decision">
+                    <transition event="browse_result" target=".">
+                        <parameter name="model"/>
+                        <script>
+                            if self.current.startswith('input_'):
+                                self.exec_input_signature[self.current.split("input_", 1)[1]] = model
+                            else:
+                                self.exec_output_signature[self.current.split("output_", 1)[1]] = model
+                        </script>
+                        <raise event="change_value" scope="narrow" target="self.stored_associations[self.current]">
+                            <parameter expr="model"/>
+                        </raise>
+                    </transition>
+
+                    <transition event="close_window" target="../../ready">
+                        <raise event="delete_instance" scope="cd">
+                            <parameter expr="'browsers'"/>
+                        </raise>
+                    </transition>
+                </state>
+            </state>
+
+            <state id="closing">
+                <transition target="../closed">
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="'model_browse_button'"/>
+                    </raise>
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="'activity_browse'"/>
+                    </raise>
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="'model_browse_entry'"/>
+                    </raise>
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="'model_browse_label'"/>
+                    </raise>
+                </transition>
+            </state>
+
+            <state id="closed">
+                <onentry>
+                    <raise event="window_close" scope="narrow" target="'parent'"/>
+                </onentry>
+            </state>
+
+            <transition event="window-close" cond="id(self) == ID" target="closing">
+                <parameter name="ID"/>
+            </transition>
+        </state>
+    </scxml>
+</class>

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1016 - 291
frontend.py


+ 1 - 0
frontend.xml

@@ -33,6 +33,7 @@
     <class src="classes/window/popup.xml"/>
     <class src="classes/window/choice_prompt_window.xml"/>
     <class src="classes/window/activity.xml"/>
+    <class src="classes/window/process_enact.xml"/>
     <class src="classes/window/create_activity.xml"/>
     <class src="classes/toolbar/toolbar.xml"/>
     <class src="classes/toolbar/generic_toolbar.xml"/>