Source code for rafcontpp.view.planning_setup_form
# Copyright (C) 2018-2019 DLR
#
# All rights reserved. This program and the accompanying materials are made
# available under the terms of the 3-Clause BSD License which accompanies this
# distribution, and is available at
# https://opensource.org/licenses/BSD-3-Clause
#
# Contributors:
# Christoph Suerig <christoph.suerig@dlr.de>
# Don't connect with the Copyright comment above!
# Version 20.08.2019
import os
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
import rafcon.gui.singleton as gui_singletons
from rafcon.utils import log
from rafcontpp.model.datastore import Datastore
from rafcontpp.control.planning_setup_form_controller import PlanningSetupFormController
from rafcontpp.control.planning_setup_form_controller import NOT_AVAILABLE, OTHER, SEL_PLANNER
logger = log.get_logger(__name__)
[docs]class PlanningSetupForm:
def __init__(self, datastore):
assert isinstance(datastore, Datastore)
self.__datastore = datastore
self.__builder = Gtk.Builder()
self.__dialog = None
self.__state_pool_chooser_entry = None
self.__runtime_data_reference = None
self.__controller = PlanningSetupFormController(datastore)
[docs] def initialize(self):
"""
initialize initiates the components with data present in the datastore, also it adds listeners for
each part e.g. a file chooser.
:return: void
"""
glade_path = os.path.abspath(
os.path.join(os.path.dirname(os.path.realpath(__file__)), "glade", "planning_setup_form.glade"))
self.__builder.add_from_file(glade_path)
# get items
self.__dialog = self.__builder.get_object('plannig_setup_form_dialog')
self.__dialog.set_title('Task Planner Plugin Configuration')
main_window = gui_singletons.main_window_controller.view['main_window']
self.__dialog.set_transient_for(main_window)
state_pool_chooser = self.__builder.get_object('state_pools_chooser')
self.__state_pool_chooser_entry = self.__builder.get_object('state_pools_chooser_entry')
type_db_chooser = self.__builder.get_object('type_db_chooser')
planner_dropdown = self.__builder.get_object('planner_dropdown')
script_path_chooser = self.__builder.get_object('script_path_chooser')
planner_argv_entry = self.__builder.get_object('planner_argv_entry')
facts_file_chooser = self.__builder.get_object('facts_file_chooser')
self.__sm_into_selected_state = self.__builder.get_object('rtpp_planning_setup_form_selected_state')
sm_into_independent_sm = self.__builder.get_object('rtpp_planning_setup-form_independent_sm_radio')
sm_name_entry = self.__builder.get_object('rtpp_sm_name_entry')
sm_save_dir = self.__builder.get_object('sm_save_dir_chooser')
keep_related_files = self.__builder.get_object('keep_produced_files_checkbox')
file_save_dir = self.__builder.get_object('file_save_dir_chooser')
runtime_data_field = self.__builder.get_object('rtpp_planning_setup_form_runtime_data_path_entry')
runtime_data_chooser = self.__builder.get_object('rtpp_planning_setup_form_runtime_data_file_chooser')
runtime_data_direct = self.__builder.get_object('rtpp_planning_setup_form_runtime_data_direct_radio')
self.__runtime_data_reference = self.__builder.get_object(
'rtpp_planning_setup-form_runtime_data_reference_radio')
# init items
state_pool_chooser.set_filename(self.__datastore.get_state_pools()[0])
self.__state_pool_chooser_entry.set_text(self.__string_array_to_string(self.__datastore.get_state_pools()))
type_db_chooser.set_filename(self.__datastore.get_type_db_path())
self.__init_drop_down(planner_dropdown, script_path_chooser)
planner_argv_entry.set_text(''.join(e + " " for e in self.__datastore.get_planner_argv()).rstrip())
facts_file_chooser.set_filename(self.__datastore.get_facts_path())
self.__sm_into_selected_state.set_active(self.__datastore.generate_into_state())
sm_into_independent_sm.set_active(not self.__datastore.generate_into_state())
sm_name_entry.set_text(self.__datastore.get_sm_name())
sm_save_dir.set_filename(self.__datastore.get_sm_save_dir())
keep_related_files.set_active(self.__datastore.keep_related_files())
keep_related_files_active = self.__datastore.keep_related_files()
self.__datastore.set_keep_related_files(True)
file_save_dir.set_filename(self.__datastore.get_file_save_dir())
self.__datastore.set_keep_related_files(keep_related_files_active)
# initialize runtime data section
if self.__datastore.get_runtime_data_path():
runtime_data_path = self.__datastore.get_runtime_data_path()
runtime_data_field.set_text(runtime_data_path)
if os.path.isfile(runtime_data_path):
runtime_data_chooser.set_filename(runtime_data_path)
self.__runtime_data_reference.set_active(self.__datastore.use_runtime_path_as_ref())
runtime_data_direct.set_active(not self.__datastore.use_runtime_path_as_ref())
self.__dialog.show_all()
# connect
self.__builder.get_object('planning_form_start_button').connect('clicked', self.__call_controller_on_apply)
self.__builder.get_object('planning_form_cancel_button').connect('clicked', self.__call_controller_on_destroy)
self.__builder.get_object('planning_form_show_state_pool_info_button').connect('clicked',
self.__call_controller_on_show_state_pool_info)
state_pool_chooser.connect('file-set', self.__controller.on_choose_state_pool, self.__state_pool_chooser_entry)
runtime_data_chooser.connect('file-set', self.__controller.on_choose_runtime_data, runtime_data_field)
# automatically choose Other... if planner script is set.
script_path_chooser.connect('file-set',
lambda x: (planner_dropdown.set_active(len(planner_dropdown.get_model()) - 1)))
def __call_controller_on_apply(self, button):
"""
This function is needed, to get the data when method is called, and not old data from declaration time.
:param button: Unused.
:return: void
"""
self.__controller.on_apply(button, self.__dialog, *self.__get_entered_data())
def __call_controller_on_destroy(self, button):
"""
This function is needed, to get the data when method is called, and not old data from declaration time.
:param button: Unused
:return: void
"""
self.__controller.on_destroy(button, self.__dialog, *self.__get_entered_data())
def __call_controller_on_show_state_pool_info(self, button):
"""
This function is needed, to get the data when method is called, and not old data from declaration time.
:param button: Unused
:return: void
"""
self.__controller.on_show_state_pool_info(button, self.__dialog, *self.__get_entered_data())
def __init_drop_down(self, drop_down, script_path_chooser):
"""
Initializes the planner drop down menu.
"""
# initiates the planner drop down with all built in planners and the script path chooser for the planenr script
# look if planner is available
active_index = 0
drop_down.append_text(SEL_PLANNER)
for index, planner in enumerate(self.__datastore.get_built_in_planners().keys()):
# dynamically import and check if planner is available.
to_import = self.__datastore.get_built_in_planners()[planner]
script_import = __import__(to_import[0], fromlist=(to_import[1]))
if getattr(script_import, to_import[1])().is_available():
drop_down.append_text(planner) # add planner to dropdown if available
else:
drop_down.append_text(planner + NOT_AVAILABLE) # also add if not availavle, but with a hint.
# set active planner to last used planner
if planner == self.__datastore.get_planner():
active_index = index + 1
drop_down.append_text(OTHER)
# set active planner to Other if script was used last.
if active_index == 0 and self.__datastore.get_planner() is not None and len(self.__datastore.get_planner()) > 0:
active_index = len(drop_down.get_model()) - 1
# initiate planner script field.
script_path_chooser.set_filename(self.__datastore.get_planner_script_path())
drop_down.set_active(active_index)
def __get_entered_data(self):
"""
Reads entered data from the planning setup form, and returns the raw values.
:return: (String, String, String, String, String, String, Boolean, String, String, Boolean, String, String, Boolean): The raw values.
"""
state_pool_text = self.__state_pool_chooser_entry.get_text()
type_db_path = self.__builder.get_object('type_db_chooser').get_filename()
planner_text = self.__builder.get_object('planner_dropdown').get_active_text()
planner_script_path = self.__builder.get_object('script_path_chooser').get_filename()
planner_argv = self.__builder.get_object('planner_argv_entry').get_text()
facts_path = self.__builder.get_object('facts_file_chooser').get_filename()
generate_into_state = self.__sm_into_selected_state.get_active()
sm_name = self.__builder.get_object('rtpp_sm_name_entry').get_text()
sm_save_dir = self.__builder.get_object('sm_save_dir_chooser').get_filename()
keep_related_files = self.__builder.get_object('keep_produced_files_checkbox').get_active()
file_save_dir = self.__builder.get_object('file_save_dir_chooser').get_filename()
rt_data_path = self.__builder.get_object('rtpp_planning_setup_form_runtime_data_path_entry').get_text()
as_reference = self.__runtime_data_reference.get_active()
return (state_pool_text, type_db_path, planner_text, planner_script_path, planner_argv,
facts_path, generate_into_state, sm_name, sm_save_dir, keep_related_files,
file_save_dir, rt_data_path, as_reference)
def __string_array_to_string(self, list):
# helper method for state pool text entry
toReturn = ''
for element in list:
toReturn += element + ':'
return toReturn