diff --git a/weight_and_balance_analysis/src/datapostprocessing.py b/weight_and_balance_analysis/src/datapostprocessing.py index 9455f5a6da4d1d1ea5c5b7693d034a2d800bdc69..9767ca87ba202f8eb23756af72aae80d854bdbf2 100644 --- a/weight_and_balance_analysis/src/datapostprocessing.py +++ b/weight_and_balance_analysis/src/datapostprocessing.py @@ -95,7 +95,10 @@ def data_postprocessing(paths_and_names, routing_dict, data_dict, runtime_output key_output_dict, method_specific_output_dict = routing_dict['func_user_method_data_output_preparation']( data_dict) # Extract tool level from routing dictionary. - tool_level = routing_dict['tool_level'] + if data_dict['current_tool_level'] is None: + tool_level = routing_dict['tool_level'] + else: + tool_level = str(data_dict['current_tool_level']) """Write data to aircraft exchange file.""" # Extract root and path to aircraft exchange file. diff --git a/weight_and_balance_analysis/src/tube_and_wing/standard/basic/methodbasic.py b/weight_and_balance_analysis/src/tube_and_wing/standard/basic/methodbasic.py index 60f287df36e090a7308905a0df8ae07a13f5a197..a1535363b3af546d6563664d67443365aa9d9f5f 100644 --- a/weight_and_balance_analysis/src/tube_and_wing/standard/basic/methodbasic.py +++ b/weight_and_balance_analysis/src/tube_and_wing/standard/basic/methodbasic.py @@ -45,7 +45,7 @@ def method_basic(paths_and_names, routing_dict, dict_ac_exchange, dict_mod_confi excel_file_path = paths_and_names['project_directory'] + \ '/' + "Seats_positions.xlsx" airplane_seatings = pd.read_excel(excel_file_path) - DEBUG(msg="ToDo: Update this when acommodation and neutral point position are available.") + DEBUG(msg="ToDo: Update this when acommodation positions are available.") # Read fuselage and wing wing = read_wing(paths_and_names) @@ -130,27 +130,29 @@ def method_basic(paths_and_names, routing_dict, dict_ac_exchange, dict_mod_confi # Maximum fuel mass + maximum fuel mass per tank maximum_fuel_mass, maximum_fuel_mass_per_tank, ferry_range_mass = calculate_maximum_fuel_mass( - tanks, operating_mass_empty, x_leading_edge_mac, mac) + tanks, operating_mass_empty, x_leading_edge_mac, mac, maximum_takeoff_mass, runtime_output) maximum_fuel_mass.print("Maximum fuel mass") ferry_range_mass.print("Ferry range mass") + # Maximum PL mass + maximum_payload_mass = calculate_maximum_payload_mass( + dict_ac_exchange["maximum_structural_payload_mass"], + main_components_mass_properties["fuselage"]).print("Maximimum payload mass") + # Design payload mass design_payload_mass = calculate_design_payload_mass( - transport_task_data, main_components_mass_properties["fuselage"]).print("Design payload mass") + transport_task_data, main_components_mass_properties["fuselage"], maximum_payload_mass, runtime_output).print( + "Design payload mass") # Design fuel mass design_fuel_mass_takeoff, design_fuel_mass_midflight, design_fuel_mass_minimum_landing, \ - design_fuel_mass_takeoff_per_tank, consumed_fuel, design_fuel_mass = \ + design_fuel_mass_takeoff_per_tank, consumed_fuel, design_fuel_mass, design_fuel_mass_per_tank = \ calculate_design_fuel_mass( - mission_information, maximum_takeoff_mass, operating_mass_empty, design_payload_mass, tanks) + mission_information, maximum_takeoff_mass, operating_mass_empty, design_payload_mass, tanks, + routing_dict, dict_ac_exchange) design_fuel_mass.path_to_element = "./analysis/masses_cg_inertia/design_fuel_mass" design_fuel_mass.print("Design fuel mass") - # Maximum PL mass - maximum_payload_mass = calculate_maximum_payload_mass( - dict_ac_exchange["maximum_structural_payload_mass"], - main_components_mass_properties["fuselage"]).print("Maximimum payload mass") - # Maximum zero fuel mass maximum_zero_fuel_mass = calculate_maximum_zero_fuel_mass( [operating_mass_empty, maximum_payload_mass], inertia_method).print("Maximum zero fuel mass") @@ -158,15 +160,20 @@ def method_basic(paths_and_names, routing_dict, dict_ac_exchange, dict_mod_confi maximum_zero_fuel_mass.center_of_gravity['x'] - x_leading_edge_mac) / mac * 100 # Design mass - design_mass_takeoff = calculate_design_mass( + design_mass = calculate_design_mass( [operating_mass_empty, design_payload_mass, - design_fuel_mass_takeoff], inertia_method - ).print("Design mass takeoff") - design_mass = copy.copy(design_mass_takeoff) + design_fuel_mass], inertia_method + ).print("Design mass") design_mass.path_to_element = "./analysis/masses_cg_inertia/design_mass" design_mass.cg_mac = ( design_mass.center_of_gravity['x'] - x_leading_edge_mac) / mac * 100 + # Design mass takeoff + design_mass_takeoff = calculate_design_mass( + [operating_mass_empty, design_payload_mass, + design_fuel_mass_takeoff], inertia_method + ).print("Design mass takeoff") + # Maximum takeoff mass maximum_takeoff_mass = copy.copy(design_mass) maximum_takeoff_mass.path_to_element = "./analysis/masses_cg_inertia/maximum_takeoff_mass" @@ -295,7 +302,7 @@ def method_basic(paths_and_names, routing_dict, dict_ac_exchange, dict_mod_confi x_coord_back_front_cargo = x_coord_front_back_cargo[::-1] runtime_output.print("CARGO...") - DEBUG(msg="cargo = luggage mass per passenger, modify/extend later with palets / add additional cargo") + DEBUG(msg="The palets positions unknown. The cargo is loaded at the same locations as the seats positions.") cg_positions_over_mac_cargo_front_back, total_mass_cargo_front_back = \ cg_change_cargo_loading_front_back( @@ -344,9 +351,9 @@ def method_basic(paths_and_names, routing_dict, dict_ac_exchange, dict_mod_confi # Determine the CG curtailment: most_fwd_CG_over_mac = min([min(cg_positions_over_mac_refueling), min(cg_positions_over_mac_passengers_front_back), - min(cg_positions_over_mac_cargo_front_back)]) + min(cg_positions_over_mac_cargo_front_back), min(cg_positions_over_mac_defueling)]) most_aft_CG_over_mac = max([max(cg_positions_over_mac_refueling), max(cg_positions_over_mac_passengers_back_front), - max(cg_positions_over_mac_cargo_back_front)]) + max(cg_positions_over_mac_cargo_back_front), max(cg_positions_over_mac_defueling)]) most_fwd_CG = most_fwd_CG_over_mac * mac / 100 + x_leading_edge_mac most_aft_CG = most_aft_CG_over_mac * mac / 100 + x_leading_edge_mac @@ -365,10 +372,14 @@ def method_basic(paths_and_names, routing_dict, dict_ac_exchange, dict_mod_confi corresponding_index = cg_positions_over_mac_passengers_front_back.index( most_fwd_CG_over_mac) corresponding_mass_most_fwd_CG = total_mass_passengers_front_back[corresponding_index] - else: + elif most_fwd_CG_over_mac in cg_positions_over_mac_cargo_front_back: corresponding_index = cg_positions_over_mac_cargo_front_back.index( most_fwd_CG_over_mac) corresponding_mass_most_fwd_CG = total_mass_cargo_front_back[corresponding_index] + else: + corresponding_index = cg_positions_over_mac_defueling.index( + most_fwd_CG_over_mac) + corresponding_mass_most_fwd_CG = total_mass_defueling[corresponding_index] runtime_output.print( f"Corresponding mass most fwd CG is of {corresponding_mass_most_fwd_CG:.2f} kg.") @@ -382,10 +393,14 @@ def method_basic(paths_and_names, routing_dict, dict_ac_exchange, dict_mod_confi corresponding_index = cg_positions_over_mac_passengers_back_front.index( most_aft_CG_over_mac) corresponding_mass_most_aft_CG = total_mass_passengers_back_front[corresponding_index] - else: + elif most_aft_CG_over_mac in cg_positions_over_mac_cargo_back_front: corresponding_index = cg_positions_over_mac_cargo_back_front.index( most_aft_CG_over_mac) corresponding_mass_most_aft_CG = total_mass_cargo_back_front[corresponding_index] + else: + corresponding_index = cg_positions_over_mac_defueling.index( + most_fwd_CG_over_mac) + corresponding_mass_most_fwd_CG = total_mass_defueling[corresponding_index] runtime_output.print( f"Corresponding mass most aft CG is of {corresponding_mass_most_aft_CG:.2f} kg.") @@ -488,6 +503,18 @@ def method_basic(paths_and_names, routing_dict, dict_ac_exchange, dict_mod_confi "Systems": systems } + # Check if the given tool_level from aircrat exchange file is None -> if true: -> initialize with 0. + if dict_ac_exchange['tool_level'] is None: + basic_output_dict['current_tool_level'] = 0 + # Else if condition: Check if given tool_level from aircrat exchange is lower than the given own tool level + # from module configuration file -> if true: Add 1 to current tool level from airaft exchange file. + elif dict_ac_exchange['tool_level'] < int(routing_dict['tool_level']): + basic_output_dict['current_tool_level'] = dict_ac_exchange['tool_level'] + 1 + # Else condition: The given tool_level from aircrat exchange is equal to the given own tool level + else: + basic_output_dict['current_tool_level'] = int( + routing_dict['tool_level']) + return basic_output_dict @@ -833,7 +860,7 @@ def calculate_maximum_landing_mass_by_regression_rwth(maximum_takeoff_mass, iner return maximum_landing_mass -def calculate_maximum_fuel_mass(tanks, ome, LE, mac): +def calculate_maximum_fuel_mass(tanks, ome, LE, mac, mtom, runtime_output): """Calculation of maximum fuel mass Args: @@ -883,6 +910,10 @@ def calculate_maximum_fuel_mass(tanks, ome, LE, mac): ferry_range_mass.cg_mac = ( max_fuel_mass.center_of_gravity['x'] - LE) / mac * 100 + if ferry_range_mass.mass >= mtom.mass: + runtime_output.warning( + "Attention: OEW + max_fuel_mass is higher than MTOW.") + return max_fuel_mass, max_fuel_mass_per_tank, ferry_range_mass @@ -973,7 +1004,7 @@ def calculate_fuel_mass_properties_evenly_distributed(tanks, fuel_mass, runtime_ return fuel_mass_properties, fuel_mass_per_tank -def calculate_fuel_mass_properties(tanks, fuel_mass): +def calculate_fuel_mass_properties(tanks, fuel_mass, routing_dict, dict_ac_exchange): """ Refuel tanks in the following priority order: 1. Left and Right wing tanks (equally). These are also sorted based on the order defined before according @@ -991,6 +1022,8 @@ def calculate_fuel_mass_properties(tanks, fuel_mass): Raises: ValueError: If the fuel mass exceeds the total tank capacity. """ + import logging + runtime_output = logging.getLogger('module_logger') # Helper function to categorize tanks based on location string def categorize_tank_location(tank): @@ -1019,7 +1052,7 @@ def calculate_fuel_mass_properties(tanks, fuel_mass): tank.energy / tank.gravimetric_density for tank in tanks) if fuel_mass > total_capacity: - raise ValueError( + runtime_output.critical( "Fuel mass to be filled up exceeds the total capacity of all tanks!") # Distribute fuel across left and right wing tanks first @@ -1142,8 +1175,12 @@ def calculate_fuel_mass_properties(tanks, fuel_mass): # Check if there is still remaining fuel (should not happen unless there is a capacity error) if remaining_fuel > 0: - raise ValueError( - "Fuel mass calculation failed ... Not enough capacity in tanks!") + if int(dict_ac_exchange['tool_level']) < int(routing_dict['tool_level']): + runtime_output.warning( + "Fuel mass calculation failed ... Not enough capacity in tanks!") + else: + raise ValueError( + "Fuel mass calculation failed ... Not enough capacity in tanks!") fuel_mass_properties = MassPropertiesIO().initialize_zero() fuel_mass_properties.mass = sum( @@ -1344,7 +1381,8 @@ def calculate_fuel_properties_defueling(tanks, fuel_to_remove, fuel_mass_per_tan def calculate_design_fuel_mass(mission_information=None, maximum_takeoff_mass=None, - operating_mass_empty=None, design_payload_mass=None, tanks=None): + operating_mass_empty=None, design_payload_mass=None, tanks=None, + routing_dict=None, dict_ac_exchange=None): """Calculation of design fuel mass Args: @@ -1377,14 +1415,14 @@ def calculate_design_fuel_mass(mission_information=None, maximum_takeoff_mass=No # distribute the fuel along the tanks and save the informations per tank # the refueling order is already saved in the sorted tanks # = (preparation for the calculation of the refueling-cg-shift) - design_fuel_mass, design_fuel_mass_takeoff_per_tank = calculate_fuel_mass_properties( - tanks, design_fuel_mass) + design_fuel_mass, design_fuel_mass_per_tank = calculate_fuel_mass_properties( + tanks, design_fuel_mass, routing_dict, dict_ac_exchange) design_fuel_mass_takeoff, design_fuel_mass_takeoff_per_tank = calculate_fuel_mass_properties( - tanks, design_fuel_mass_at_takeoff) + tanks, design_fuel_mass_at_takeoff, routing_dict, dict_ac_exchange) design_fuel_mass_midflight, _ = calculate_fuel_mass_properties( - tanks, design_fuel_mass_midflight) + tanks, design_fuel_mass_midflight, routing_dict, dict_ac_exchange) design_fuel_mass_landing_minimum, _ = calculate_fuel_mass_properties( - tanks, design_fuel_mass_landing_minimum) + tanks, design_fuel_mass_landing_minimum, routing_dict, dict_ac_exchange) else: contingency_fuel_factor = 0.05 alternate_fuel_factor = 0.1 @@ -1404,16 +1442,17 @@ def calculate_design_fuel_mass(mission_information=None, maximum_takeoff_mass=No design_fuel_mass_takeoff, design_fuel_mass_takeoff_per_tank = calculate_fuel_mass_properties( tanks, design_fuel_mass_takeoff) design_fuel_mass_midflight, _ = calculate_fuel_mass_properties( - tanks, design_fuel_mass_midflight) + tanks, design_fuel_mass_midflight, routing_dict, dict_ac_exchange) design_fuel_mass_landing_minimum, _ = calculate_fuel_mass_properties( - tanks, design_fuel_mass_landing_minimum) + tanks, design_fuel_mass_landing_minimum, routing_dict, dict_ac_exchange) design_fuel_mass = design_fuel_mass_at_takeoff + design_fuel_mass_per_tank = design_fuel_mass_takeoff_per_tank return (design_fuel_mass_takeoff, design_fuel_mass_midflight, design_fuel_mass_landing_minimum, - design_fuel_mass_takeoff_per_tank, consumed_fuel_during_flight, design_fuel_mass) + design_fuel_mass_takeoff_per_tank, consumed_fuel_during_flight, design_fuel_mass, design_fuel_mass_per_tank) -def calculate_design_payload_mass(transport_task_data, fuselage_mass_properties): +def calculate_design_payload_mass(transport_task_data, fuselage_mass_properties, max_payload, runtime_output): """Design payload mass Args: @@ -1427,9 +1466,17 @@ def calculate_design_payload_mass(transport_task_data, fuselage_mass_properties) "./analysis/masses_cg_inertia/design_payload_mass") design_payload_mass.mass = transport_task_data.combined_passenger_and_luggage_mass + \ transport_task_data.additional_cargo_mass + + if design_payload_mass.mass > max_payload.mass: + runtime_output.critical( + "Design payload mass exceeds the maximum allowed payload mass!") + raise ValueError( + "Design payload mass exceeds the maximum allowed payload mass!") + # cargodeck + passenger_deck + additional cargo design_payload_mass.center_of_gravity = fuselage_mass_properties.center_of_gravity design_payload_mass.initialize_zero_inertia() + DEBUG(msg="The CG of the design payload is set at the fuselage CG.") return design_payload_mass @@ -1473,8 +1520,8 @@ def cg_change_cargo_loading_front_back(initial_cg, initial_weight, x_coordinate_ cg_positions.append(initial_mac_position) for row in range(len(x_coordinate_row)): - added_mass = transport_task_data.luggage_mass_per_passenger * \ - transport_task_data.number_of_passengers / len(x_coordinate_row) + added_mass = (transport_task_data.luggage_mass_per_passenger * transport_task_data.number_of_passengers + + transport_task_data.additional_cargo_mass) / len(x_coordinate_row) total_weight_new += added_mass total_moment_change += added_mass * (x_coordinate_row[row]) @@ -1574,6 +1621,7 @@ def calculate_maximum_payload_mass(maximum_structural_payload_mass, fuselage_acc # Use accomodation center_of_gravity maximum_payload_mass.center_of_gravity = fuselage_accomodation_mass_properties.center_of_gravity maximum_payload_mass.initialize_zero_inertia() + DEBUG(msg="The CG of the maximum payload is set at the fuselage CG.") return maximum_payload_mass @@ -1626,7 +1674,7 @@ def calculate_mtow_max_payload(ome, maximum_payload_mass, wing, mtom, LE, mac): mtow_max_payload.center_of_gravity = ( ome.mass * ome.center_of_gravity['x'] + fuel * wing.center_of_gravity['x'] + maximum_payload_mass.mass * maximum_payload_mass.center_of_gravity['x']) / mtow_max_payload.mass - # DEBUG(msg="Estimated CG (fuel CG set in wing CG)") + DEBUG(msg="Estimated CG of MTOM with max payload. (fuel CG set in wing CG, payload CG set in fuselage CG.)") mtow_max_payload.cg_mac = ( mtow_max_payload.center_of_gravity - LE) / mac * 100.0 @@ -1643,7 +1691,7 @@ def calculate_mtow_max_fuel(ome, fuel_mass, wing, fuselage, mtom, LE, mac): mtow_max_fuel.mass = ome.mass + max_fuel + payload_mass mtow_max_fuel.center_of_gravity = (ome.mass * ome.center_of_gravity['x'] + max_fuel * wing.center_of_gravity['x'] + payload_mass * fuselage.center_of_gravity['x']) / mtow_max_fuel.mass - # DEBUG(msg="Estimated CG (fuel CG set in wing CG)") + DEBUG(msg="Estimated CG of MTOM with max fuel. (fuel CG set in wing CG, payload CG set in fuselage CG.)") mtow_max_fuel.cg_mac = (mtow_max_fuel.center_of_gravity - LE) / mac * 100.0 return mtow_max_fuel @@ -1865,7 +1913,7 @@ def read_operator_items(ac_exchange_file, fuselage_length): total_mass += operator_items[i].mass fuselage_operator_items_mass = total_mass i = i + 1 - # DEBUG(msg="CGs of fuselage operator items missing in axml -> estimated here at 45% fuselage length") + DEBUG(msg="CGs of fuselage operator items estimated here at 45% fuselage length") systems_operator_nodes = ac_exchange_file.findall( "./component_design/systems/operator_items/operator_item[@ID]" diff --git a/weight_and_balance_analysis/src/tube_and_wing/standard/general/methodhtmlreport.py b/weight_and_balance_analysis/src/tube_and_wing/standard/general/methodhtmlreport.py index 8c8046d2c24a2fea9e5f2b75d2c17875c374ae18..0db9803744c282ed5f14c2e0d3e832a6adb2ffd0 100644 --- a/weight_and_balance_analysis/src/tube_and_wing/standard/general/methodhtmlreport.py +++ b/weight_and_balance_analysis/src/tube_and_wing/standard/general/methodhtmlreport.py @@ -28,9 +28,9 @@ def method_html_report(paths_and_names, routing_dict, data_dict, method_specific # general aircraft masses aircraft_general_masses = [ - ("Manufacturer Mass Empty", "MME", + ("Manufacturer Empty Mass", "MEM", data_dict["manufacturer_mass_empty"].mass), - ("Operating Mass Empty", "OME", + ("Operating Empty Mass", "OEM", data_dict["operating_mass_empty"].mass), ("Maximum Takeoff Mass", "MTOM", data_dict["maximum_takeoff_mass"].mass), @@ -49,6 +49,7 @@ def method_html_report(paths_and_names, routing_dict, data_dict, method_specific ("Maximum Landing Mass", "MLM", data_dict["maximum_landing_mass"].mass), ("Design Payload Mass", "-", data_dict["design_payload_mass"].mass), + ("Design Fuel Mass", "-", data_dict["design_fuel_mass"].mass), ("Design Fuel Mass Takeoff", "-", data_dict["design_fuel_mass_takeoff"].mass), ("Design Fuel Mass Midflight", "-", diff --git a/weight_and_balance_analysis/src/tube_and_wing/standard/general/methodplot.py b/weight_and_balance_analysis/src/tube_and_wing/standard/general/methodplot.py index 17fa169b3345dbb7978873f289bffe382c32ca19..9247c045c78947da6381c2325ba843c4e8f87411 100644 --- a/weight_and_balance_analysis/src/tube_and_wing/standard/general/methodplot.py +++ b/weight_and_balance_analysis/src/tube_and_wing/standard/general/methodplot.py @@ -75,9 +75,9 @@ def method_plot(paths_and_names, routing_dict, data_dict, method_specific_output # Configure the plot ax.set_ylabel('Mass (kg)', color='#ecf0f1') - ax.set_title('Operating Mass Empty and its Components', color='#ecf0f1') + ax.set_title('Operating Empty Mass and its Components', color='#ecf0f1') ax.set_xticks(ind) - ax.set_xticklabels(['OME'] + components) + ax.set_xticklabels(['OEM'] + components) # Manually add legend entries for structure components and others handles, labels = ax.get_legend_handles_labels() @@ -119,11 +119,11 @@ def method_plot(paths_and_names, routing_dict, data_dict, method_specific_output plt.plot(data_dict["Defueling CG change"], data_dict["Defueling mass change"], 'm') # Defueling legend_labels = ['Refueling', 'Pax from front', 'Pax from back', 'Cargo from front', 'Cargo from back', - 'Defueling', 'OME', 'MTOM', 'Neutral point Ma=0,83', + 'Defueling', 'OEM', 'MTOM', 'Neutral point Ma=0,83', 'Most fwd CG', 'Most aft CG', 'NP-5%'] else: legend_labels = ['Refueling', 'Pax from front', 'Pax from back', 'Cargo from front', 'Cargo from back', - 'OME', 'MTOM', 'Neutral point Ma=0,83', + 'OEM', 'MTOM', 'Neutral point Ma=0,83', 'Most fwd CG', 'Most aft CG', 'NP-5%'] N = np.arange(data_dict["Most forward CG mac position"] - 5, max( @@ -184,7 +184,7 @@ def method_plot(paths_and_names, routing_dict, data_dict, method_specific_output data_dict["design_mass"].mass, 's') # Define legend labels and colors - legend_labels2 = ['OME', 'MZFM (max Payload)', 'max Payload + Fuel', 'max Fuel + Payload', 'max Fuel', + legend_labels2 = ['OEM', 'MZFM (max Payload)', 'max Payload + Fuel', 'max Fuel + Payload', 'max Fuel', 'Design Fuel + Design Payload'] legend = plt.legend(legend_labels2, loc='lower right', fontsize='small') for text in legend.get_texts(): diff --git a/weight_and_balance_analysis/src/tube_and_wing/standard/usermethoddatapreparation.py b/weight_and_balance_analysis/src/tube_and_wing/standard/usermethoddatapreparation.py index 298f8d9de3b9d4e60ab196879bab9dd578ebc4e0..61e300cf2e52b7bdea75cbbf2f025b1c25a0e513 100644 --- a/weight_and_balance_analysis/src/tube_and_wing/standard/usermethoddatapreparation.py +++ b/weight_and_balance_analysis/src/tube_and_wing/standard/usermethoddatapreparation.py @@ -73,6 +73,7 @@ def user_method_data_input_preparation(routing_dict): "energy_carrier_density": [design_specification_path + 'energy_carriers/energy_carrier[@ID="0"]/density', float], "energy_carrier_type": [design_specification_path + 'energy_carriers/energy_carrier[@ID="0"]/type', str], + 'tool_level': ['./analysis/masses_cg_inertia', 'tool_level'], } """Module configuration file.""" diff --git a/weight_and_balance_analysis/weight_and_balance_analysis_conf.xml b/weight_and_balance_analysis/weight_and_balance_analysis_conf.xml index da478266d45f09938a230098cdaa7447f7ed73a3..3e6a25636c7ba0d2bfbc8627e11aa5bf2a5228c2 100644 --- a/weight_and_balance_analysis/weight_and_balance_analysis_conf.xml +++ b/weight_and_balance_analysis/weight_and_balance_analysis_conf.xml @@ -8,7 +8,7 @@ <value>../projects/</value> </aircraft_exchange_file_directory> <own_tool_level description="Specify the tool level of this tool"> - <value>2</value> + <value>3</value> </own_tool_level> <console_output description="Selector to specify the console output. Selector: mode_0 (Off) / mode_1 (only out/err/warn) / mode_2 (1 + info) / mode_3 (2 + debug)"> <value>mode_1</value>